如何模块化javascript?

时间:2011-07-14 08:25:58

标签: javascript

我有两个网页(a.php& b.php)。它们具有非常相似的逻辑但不同的UI。我写了两个javascript。

它们看起来都像:

aUI = {
    displayMessage = function ...
    showDetails = function ...
}
function foo() {
    aUI.displayMessage();
    aUI.showDetails();
    //    and other things about aUI.displayMessage() and aUI.showDetails()...
}
foo();

aUI.displayMessage()与bUI.displayMessage()不同。但是a.js和b.js有相同的foo()。

我提取了foo()。所以现在我有三个.js:aUI.js,bUI.js和logic.js.

logic.js:

function foo() {
    UI.displayMessage();
    UI.showDetails();
    //other things about UI
}
foo();    

aUI.js和bUI.js:

UI = {
    displayMessage = function ...
    showDetail = function ...
}

a.php怎么知道它应该使用aUI.js?我写了简单的工具:

<script type="text/javascript" src="aUI.js"></script>
<script type="text/javascript" src="logic.js"></script>  

它有效,但似乎并不聪明。我在项目中有重复的命名空间“UI”。

有更好的方法吗?

3 个答案:

答案 0 :(得分:4)

这个怎么样?

aUI.js和bUI.js有自己的命名空间,如aUIbUI。 并添加更多这样的代码:

<script type="text/javascript" src="aUI.js"></script>
<script type="text/javascript">
  var UI = aUI;
</script>
<script type="text/javascript" src="logic.js"></script>  

此方法解决了重复命名空间“UI”的问题。我认为这是一种DI。

答案 1 :(得分:1)

这听起来像是继承要解决的经典问题。您可以在javascript中以任意多种方式执行此操作。以下是一些例子。

例如,如果您在Dojo中执行此操作,它将看起来像这样

UI-base.js

dojo.declare("_UI", null, {
  displayMessage: function() { },
  showDetails: function() { },
  foo: function() {
    this.displayMessage();
    this.showDetail();
  }
});

UI-a.js

dojo.declare("UI", _UI, {
  displayMessage: function() { /* Override and define specific behavior here */ },
  showDetails: function() {  /* Override and define specific behavior here */ }
});

UI-b.js

dojo.declare("UI", _UI, {
  displayMessage: function() { /* Override and define specific behavior here */ },
  showDetails: function() {  /* Override and define specific behavior here */ }
});

然后,在您的PHP中,您只需包含相应的javascript文件

a.php只会

<script src="ui-base.js"></script>
<script src="ui-a.js"></script>

b.php

<script src="ui-base.js"></script>
<script src="ui-b.js"></script>

*世界上有太多的jQuery示例可以制作另一个,所以这次你得到了Dojo;)

答案 2 :(得分:-1)

解决方案是构建您不需要执行此操作并重复代码的代码。 但是如果你想坚持下去,那么你可以创建一个名为logic.php的文件,并在里面做类似的事情

header("Cache-Control: no-cache");
$currentScript = reset(explode(".", end(explode("/", $_SERVER["SCRIPT_NAME"]))));
read_file("scripts/" . $currentScript . ".js");
echo "\n;\n";
read_file("scripts/logic.js");

和html

<script type="text/javascript" src="logic.php"></script>

这样脚本将改变它的内容,因为它将根据它的名称和logic.js的内容连接所需的脚本。这样做的缺点是无效的浏览器缓存。

另一种解决方案是在logic.js中同步加载您需要的其他模块。您可以从document.location.href

获取脚本的名称