【问题标题】:Generic vs application initialization for typescript module based application基于打字稿模块的应用程序的通用与应用程序初始化
【发布时间】:2014-09-15 15:51:37
【问题描述】:

我正在将我现有的 JS 应用程序(购物车 + 相关网站)转移到 Typescript。

我现在在我的 JS 文件中有一大堆函数来初始化不同的外部组件

    // Initialize components
    initBrowser();
    initKnockout();
    initModernizr();
    initjQM();
    initGoogleAnalytics();

他们设置了从window.console.log 到knockout.js 的所有绑定、自定义Modernizr.js 测试和jQuery 移动页面转换逻辑。

我的问题是我应该如何在 Typescript 模块中最好地使用模块来组织和初始化这样的事情。 (我的应用很小,我只使用内部模块)

选项 1:没有“类”的模块,只是初始化所有内容

module RR
{
     initBrowser();
     initKnockout();
     initModernizr();
     initJQM();
     initGoogleAnalytics();

     // define functions
}

选项 2:带有“静态初始化程序”类的模块

module RR 
{
    class AppInitializer
    {
        private static instance:AppInitializer = new AppInitializer(); 

        constructor()
        {
           initBrowser();
           initKnockout();
           initModernizr();
           initJQM();
           initGoogleAnalytics();             
        }

        // define functions
     }
}

选项 3:初始化所有内容且仅创建一次的单个应用程序对象

module RR 
{
    class MyApp
    {    
        constructor()
        {
           init();             
        }

        init()
        {
            initBrowser();
            initKnockout();
            initModernizr();
            initJQM();
            initGoogleAnalytics(); 
        }

        // define functions
     }

     // create the application
     var MyApp = new MyApp();

}

选项4:......你的想法......

什么是初始化与特定应用程序模块或类没有真正关系的此类事物的好方法。

此外,我还有其他初始化函数来设置我的 jQuery 不显眼的初始化,例如。我的登录按钮,客户服务页面逻辑。这些功能是特定于实际网站的,与我之前提到的功能不同

    // initialize shopping cart
    initLogin();
    initCustomerService();
    initVideo(true);

到目前为止,我只是在一个闭包中一次性初始化了所有内容,但我想更好地组织事情,并希望得到任何建议。

【问题讨论】:

  • 我喜欢你的第三个选项。无论您的应用程序大小如何,它似乎都更合适。如果您想添加单元测试/模拟,这使您可以选择添加接口。

标签: typescript


【解决方案1】:

您可以使用外部模块。 Bootstrap.ts:

// Load components
import initBrowser = require('./initBrowser');
import initKnockout = require('./initKnockout');
import initModernizr = require('./initModernizr');
import initjQM = require('./initjQM');
import initGoogleAnalytics = require('./initGoogleAnalytics');

// Initialize components
initBrowser();
initKnockout();
initModernizr();
initjQM();
initGoogleAnalytics();

这样您就不必担心对 JavaScript 文件进行排序。代码编写方式中的顺序是明确的并且您不会不必要地污染window。

要了解有关外部模块的更多信息:http://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1

【讨论】:

  • 已经看过那个 :-) 顺便说一句,你在这些视频上做得很棒。我需要坐下来看着他们。我确实注意到该特定视频中的一个特定遗漏 - 那就是如何让 Visual Studio 为您将模块编译成单个 .js 文件。就像点击Combine JavaScript outputs into one file 一样简单,但我花了半个下午才弄清楚如何做。我没有足够大的文件来保证外部加载程序,所以我希望 IDE 编译成一个文件。也许那是一个新功能,但我希望它出现在那个视频中以节省我的时间:)
  • 我意识到你不使用 Visual Studio,也许现在这是一个新功能,但是现在我找到了这个复选框让我的生活变得更轻松
  • @Simon_Weaver 谢谢:)。仅供参考,如果您使用该功能,请注意您需要一个 _reference 文件来管理 TypeScript 文件的组合顺序。 PS:grunt-ts 可以为您创建 github.com/grunt-ts/grunt-ts#reference-file-generation
猜你喜欢
  • 2013-12-13
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多