【问题标题】:Titanium (Node.js) require() vs GlobalTitanium (Node.js) require() 与全局
【发布时间】:2015-05-13 08:41:07
【问题描述】:

我不确定以下任何一项是否被认为是更好的做法。

环境: Appcelerator Titanium/Alloy,这是一个制作原生应用程序的框架。它使用 javascript 作为源代码,与 node.js 相当(更像 CommonJS)。

案例 1:

我使用的许多文件:

var localInstance = require('main/module/sub/foobar')({ initialize: true});

案例 2:

我将在其中创建全局文件的主文件:

Globalnamespace.foobar = require('main/module/sub/foobar');

在其他文件中:

var localInstanceWhichINeed = Globalnamespace.foobar({initialize: false});

关键是模块并不是到处都需要的,把它放在全局命名空间中可能会占用不必要的内存。每个foobar模块都需要在每个文件中实例化,所以没有全局实例(只有一个模块来做实例)。

我说的是移动设备内存,我正试图减少它。因此问题。

【问题讨论】:

    标签: javascript node.js titanium require commonjs


    【解决方案1】:

    我不是回答这个问题的最佳人选。但是,我调查了同样的问题,因此有一些可能对您有所帮助的见解;-)

    CommonJS 模块的工作方式是在您第一次引用它们时加载它们。因此,后续推荐的成本非常低。因此,我会说这更像是一个关于“味道”的问题。就个人而言,我倾向于使用您提到的第一种方法,即。像这样:

    var UiHelper = require('ui/helper);
      :
      :
    UiHelper.showListBox(.....);
    

    所以回到你的问题 - 我不认为使用其中一个会受到惩罚。它更多地是关于你想如何构建你的代码;-)

    /约翰

    【讨论】:

    • 好吧,这是有道理的,如果require() 已经使用一种友好的方法来防止无用的重新加载,那么我将使用该选项。我想这仍然是一个微优化,因为case 2 会将它加载到您可能不需要它的地方
    • 我同意这一点 - 这就是为什么我使用如图所示的其他方法(如您的案例 1);-)
    【解决方案2】:

    特别是关于命名空间的使用和 Titanium:我不推荐它。命名空间很容易超出范围。即使您将它们绑定到 Ti.App(也不是一个好主意)。

    CommonJS(尤其是在 Titanium 的最新版本中)非常擅长不重新加载之前加载的内容。

    如果您担心内存问题,请确保您的所有视图和窗口在完成后都被销毁。这是 Titanuim 中排名第一的东西。

    【讨论】:

    • +1 同样,如果您是第一个,也会标记为最佳答案。我还没有定义一个可以轻松销毁视图和控制器的结构(我使用Alloy MVC),因为只要你自己不主动帮助它,我就听说过很多关于糟糕的垃圾收集的事情。
    • 我不使用合金,但一般的做法是创建一个离屏窗口,将所有视图移动到它并删除该窗口。在 Android 中效果不如窗口喜欢在屏幕上显示,但 Android 在垃圾收集方面做得更好......
    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 2012-02-15
    • 2023-02-19
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多