首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模块化javascript?

如何模块化javascript?
EN

Stack Overflow用户
提问于 2011-07-14 16:25:58
回答 3查看 1.7K关注 0票数 7

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

它们看起来都像:

代码语言: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:

代码语言:javascript
复制
function foo() {
    UI.displayMessage();
    UI.showDetails();
    //other things about UI
}
foo();    

aUI.js和bUI.js:

代码语言:javascript
复制
UI = {
    displayMessage = function ...
    showDetail = function ...
}

a.php如何知道它应该使用aUI.js?我写了一个简单的实现:

代码语言:javascript
复制
<script type="text/javascript" src="aUI.js"></script>
<script type="text/javascript" src="logic.js"></script>  

它是有效的,但看起来并不聪明。我在项目中有重复的命名空间'UI‘。

有没有更好的方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-14 17:04:04

那这个呢?

aUI.js和bUI.js有自己的命名空间,就像aUIbUI一样。并添加更多代码,如下所示:

代码语言:javascript
复制
<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。

票数 4
EN

Stack Overflow用户

发布于 2011-07-14 17:23:51

这听起来像是一个经典的问题,需要通过继承来解决。在javascript中,您可以使用任意数量的方法来完成此操作。这里有几个例子。

经典继承:http://www.crockford.com/javascript/inheritance.html

  • Prototypal继承:http://javascript.crockford.com/prototypal.html

  • dojo.declare:http://docs.dojocampus.org/dojo/declare *

例如,如果您在Dojo中执行此操作,它将如下所示

ui-base.js

代码语言:javascript
复制
dojo.declare("_UI", null, {
  displayMessage: function() { },
  showDetails: function() { },
  foo: function() {
    this.displayMessage();
    this.showDetail();
  }
});

ui-a.js

代码语言:javascript
复制
dojo.declare("UI", _UI, {
  displayMessage: function() { /* Override and define specific behavior here */ },
  showDetails: function() {  /* Override and define specific behavior here */ }
});

ui-b.js

代码语言:javascript
复制
dojo.declare("UI", _UI, {
  displayMessage: function() { /* Override and define specific behavior here */ },
  showDetails: function() {  /* Override and define specific behavior here */ }
});

然后,在PHP中只需包含适当的javascript文件

a.php

代码语言:javascript
复制
<script src="ui-base.js"></script>
<script src="ui-a.js"></script>

b.php

代码语言:javascript
复制
<script src="ui-base.js"></script>
<script src="ui-b.js"></script>

*世界上有太多的jQuery示例,无法再创建另一个示例,因此这一次您将获得Dojo ;)

票数 2
EN

Stack Overflow用户

发布于 2011-07-14 16:54:36

解决方案是架构你的代码,你不需要这样做和重复代码。但是如果您想继续使用它,那么可以创建一个名为logic.php的文件,在里面做如下所示

代码语言:javascript
复制
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格式

代码语言:javascript
复制
<script type="text/javascript" src="logic.php"></script>

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

另一种解决方案是在logic.js中同步加载您需要的另一个模块。您可以从document.location.href获取脚本的名称

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6690412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档