如何规划一个新的 JS 应用程序的结构

How to plan the structure of a new JS application

我即将开始一个项目,使用他们的 Client-Server App 技术为 Apple TV 创建一个应用程序。该应用程序将使用 Javascript 编写,并将使用 Apple 的 JavaScript API(称为 TVJS)处理 XML 模板视图(称为 TVML)的加载。

他们的代码示例非常基础;只是一个文件,其中包含一些用于加载模板、处理单击事件等的功能...

在我从事的其他项目中,我有幸使用了一个已经预定义的结构,例如,我使用 Appcelerator Titanium 构建了一个 iOS 应用程序,该应用程序与它自己记录的 MVC 框架一起打包.

但是,现在我一个人在野外,我需要考虑如何在纯 Javascript.

中设置应用程序结构

有人可以告诉我从哪里开始创建应用程序文件和代码结构吗?我正在努力寻找在线初学者教程。

如果您觉得可以以更 eloquent 的方式提出这个问题以帮助遇到这个问题的人,请随时编辑这个问题。

100% 建议使用 React + Redux:http://teropa.info/blog/2015/09/10/full-stack-redux-tutorial.html

我使用此模板相对较快地构建了几个新项目。

任何您想尝试的东西,请使用 Apple 提供的 TVMLCatalog 示例代码。

构建应用程序,基本上您需要考虑 2 个角色,一个是视图端(模板),另一个是事件处理(Presenter.js 示例)。

做一个通用的文档加载功能,能用多少就用多少。 每当触发事件时,使用一些 if/else 块或 switch 语句来确定要做什么。

Presenter端需要的代码我都加完了,我想如果你懂JS,剩下的应该很容易搞定。

defaultPresenter: function(xml) {
    if(this.loadingIndicatorVisible) {
        navigationDocument.replaceDocument(xml, this.loadingIndicator);
        this.loadingIndicatorVisible = false;
    } else {
        navigationDocument.pushDocument(xml);
    }
},
addEventsToDocument: function(doc){
    doc.addEventListener("select", this.load.bind(this));
    doc.addEventListener("play", this.load.bind(this));
    doc.addEventListener("highlight", this.load.bind(this));
    doc.addEventListener("holdSelect", this.load.bind(this));
    doc.addEventListener("change", this.load.bind(this));
},
buildCompilationTemplate: function(params, data) {
    var resource = TemplateCompilation(params, data);
    this.buildDefaultTemplate(resource);
},
buildDefaultTemplate: function(resource) {
    var doc = this.makeDocument(resource);
    this.addEventsToDocument(doc);
    this.defaultPresenter.call(this, doc);
},
load: function(event) {
    var self = this,
        ele = event.target,
        navigateTo = ele.getAttribute("navigateTo");

    if (navigateTo !== '') {
        if (event.type !== "select"){
            return;
        }
        if (navigateTo === 'Compilation') {
            var params = ele.getAttribute('params');
            fetchCompilationService(params, function(data) {
                self.buildCompilationTemplate(params, data);
            });
        }

回答来自关于 non-presenter 代码结构的评论的问题:

目前加载脚本的方式是使用evaluateScripts函数,没有import或者require机制。尽管可以编写一个工具来使它们工作。

因此目前唯一的选择是使用gulp / grunt 来连接js文件。您可以在 gulp 脚本中指定 js 文件的顺序,并构建单个 js 文件进行交付。我的偏好如下:

app.js
js
  API.js
  services.js
  vendor
    async.min.js
resources
templates
  home.xml.js
  episode.xml.js
  most-popular.xml.js

主要入口点是 app.js 文件,它具有特定于应用程序的配置并调用模板、事件设置等。

error.js 文件包含我在所有应用程序中使用的一些错误处理函数。基本上是一些 alertTemplates.

API.js 文件有 service-specific 个配置函数。

service.js 文件,我在其中使用 API.js 抽象进行所有 AJAX 调用。

这种设置对我来说效果很好。

您可以使用 gulp 合并和缩小所有这些文件,并仅从您的 xCode 项目中引用该文件。