angular - 共享混合移动应用程序和桌面 Web 应用程序的代码

标签 angular web-applications ionic2 hybrid-mobile-app

我想构建一个全新的应用程序,既可以部署为混合移动应用程序,也可以部署为桌面网络应用程序。

这两个应用的逻辑和用户界面大多非常相似。 除了一些差异:

  1. 针对移动设备的屏幕尺寸优化(例如,移动设备中的隐藏侧边菜单与桌面设备中的展开菜单)
  2. 移动设备中的触摸手势 (3DTouch) 与桌面设备中的悬停功能
  3. 移动设备中某些元素的触摸反馈
  4. 移动设备中的页面导航与桌面设备中的路由导航

我想到了使用 angular-material桌面组件,以及 Ionic用于移动设备的组件和导航,因为两者都构建在 Angular 之上。

当然,我的目标是尽可能多地分享代码,包括逻辑代码和 UI 容器组件。

因此,我在为桌面 UI、移动 UI、共享 UI 和逻辑创建单独的 Angular 模块时,试图想出一种构建项目的好方法:

一种选择是为两个应用程序使用一个核心模块,导入逻辑和共享 UI 模块。然后在为每个平台构建时在特定平台 UI 模块之间切换。在此选项中,特定于平台的 UI 组件将具有相同的 selector@Input,但它们呈现的 UI 会有所不同。

第二种选择是为每个将导入逻辑模块和共享 UI 组件模块的平台应用程序设置单独的核心模块。

也许有人有做过这样的事情的经验,可以分享他对涵盖所有这些的最佳项目结构的想法?

或者我建议的哪个项目结构更好?

最佳答案

根据我的经验,以下是有效的

  1. 创建 2 个具有独立文件结构的独立“前端”项目 在单独的目录中,使用特定的“命令行工具” 框架(Angular CLI、Ionic CLI、NativeScript CLI)。
  2. 创建一个包含要共享的公共(public)模块的公共(public)项目 通过“前端”项目
  3. 从您的代码存储库中将共享模块导入“前端” 结束'项目(例如在名为'shared'的目录下) - 确保 您使前端项目与相同的通用版本保持一致 “共享”项目的

真正的技巧是设置“共享”模块的边界,以便在不增加代码复杂性的情况下最大限度地重用(例如,通过在“共享”代码中检查环境——我避免使用环境变量定义代码是在 Ionic 还是 Angular 中运行,并根据该变量做出决定)。

我的经验法则是“前端”项目定义所有组件(即组件不共享)。

组件的逻辑很浅,通常是这样的

  • 他们在构造函数中定义他们使用的服务
  • ngOnInit() 方法中他们订阅了 Observables services 方法返回的兴趣 - 订阅逻辑 填充包含 View 中显示的数据的变量
  • ngOnDestroy() 中取消订阅
  • 组件定义了管理前端事件的方法——例如 方法通常调用共享服务上的方法

正确的设计在编码时出现。我的意思是,一旦你建立了基本结构(即“前端”项目和“共享”项目),你就开始为一个前端(例如浏览器的 Angular)编码。有些决定很容易做出(例如,查询后端的所有逻辑通常是共享的)。其他一些决定更棘手,逻辑越接近前端表面就越真实。一旦您看到组件中的逻辑变得越来越厚,您就会开始怀疑是否有值得分享的东西,因为其他“前端”(比如说 Ionic)也可能是通用的。如果是这种情况,那么您将进行重构,将代码移至“共享”服务。

还请记住通过测试充分保护“共享”服务。

希望对你有帮助

关于angular - 共享混合移动应用程序和桌面 Web 应用程序的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44093799/

相关文章:

javascript - 如何在 Protractor 中的套件之间共享相同的测试用例

javascript - 达到 maxLength 时将输入焦点移至下一个输入 - Angular 4/Typescript

java - 我如何在 Maven 中结合 WAR 打包和 OSGi 包创建?

javascript - 有什么不使用 AJAX 的重要原因吗?

javascript - OneSignal 与 Angular 2

css - 使底部薄片(弹出框)粘在按钮上( Angular Material )

android - HTML 5 音频播放器和 Android/iOS

cordova - 如何从 ionic 应用程序中删除闪屏

typescript - 我如何有条件地隐藏和显示选项卡 - Ionic 2?

javascript - Angular 2 : How to handle a async image (blob) request?