在主要“肉”仍然是服务器端的 webapps 中组织 JS 代码的最佳方法是啥?

Posted

技术标签:

【中文标题】在主要“肉”仍然是服务器端的 webapps 中组织 JS 代码的最佳方法是啥?【英文标题】:What is the best way to organize JS code in webapps where the main "meat" is still server side?在主要“肉”仍然是服务器端的 webapps 中组织 JS 代码的最佳方法是什么? 【发布时间】:2011-05-04 02:39:08 【问题描述】:

在使用 Django、Kohana、Rails 等 MVC Web 框架构建 Web 应用程序时,我最初将没有 JS 驱动组件的应用程序放在一起,然后将它们作为“改进”添加到 UI。

这种方法会导致非侵入式 JS,但我没有一个好的“标准”方式来组织 JS 工作。我在此类应用程序中编写的大多数 JS 都是 10-30 行 JQuery sn-ps,它们与 UI 的某些非常特定的部分挂钩。

到目前为止,我经常将这些东西与它们管理的 UI 部分一起内联。这让我觉得很脏,我想让 JS 代码像 python / php / ruby​​ 代码一样有条理,我希望它是可测试的,我希望它是可重用的。

在这样的设置中组织 JS 代码的最佳方法是什么,我们没有构建成熟的 JS 客户端应用程序,主要内容仍然是服务器端?

【问题讨论】:

【参考方案1】:

我也很关心其他人对此的看法。我采用的方法是使用对象文字表示法来存储大部分函数,​​并将它们存储在一个包含在所有页面(库)中的文件中

uiHelper = 
    inputDefault:function(defaulttext)
    // function to swap default text into input elements
    ,
    loadSubSection:function(url)
    // loads new page using ajax instead of refreshing page
    ,
    makeSortable:function()
    // apply jQuery UI sortable properties to list and remove non javascript controls
    

然后,我在需要使用库的任何页面上包含一个 .js 文件,该库将该页面上的元素与库中的函数联系起来。我试图让每个函数尽可能地重复使用,有时页面上的事件绑定函数会调用我的几个库函数。

$(document).ready(function()
    $('#mybutton').live('click',uiHelper.loadSubSection);

    //more complicated helper
    $('#myotherbutton').live('click',function()
        uiHelper.doThisThing;
        uiHelper.andThisThing;
    );
);

编辑:使用 jsDoc http://jsdoc.sourceforge.net/ 表示法对这些函数进行注释可以为“库”生成文档,并有助于使您的代码易于阅读(函数由 cmets 拆分)。

以下问题与您自己的问题类似 - 您应该检查一下...

Commonly accepted best practices around code organization in JavaScript

【讨论】:

我认为这是一个正确的方向,将一个通用的 UI 方法库放在一起。就像你说的那样,这为拥有适当的文件结构打开了大门,这反过来又允许使用文档、测试、缩小等进行自动构建。它仍然需要使用模板内联内容。也许只是将一个 js 文件直接包含在执行事件绑定的模板(类似于 mytemplate.html 和 mytemplate.html.js)中...... 在我当前的应用程序中,我的控制器知道它的 url(例如 'users/edit/')并检查文件系统上是否存在合作伙伴 .js 文件。如果是这样,它会将这些信息传递给模板,模板会自动使用 url 作为加载 js 文件的约定来包含它。在这种情况下,它会知道加载 /js/pages/users/edit.js。我在运行时使用code.google.com/p/minify 缩小/连接和缓存 我正在考虑为我的 Django 应用程序做一些类似的事情。我想要一个自动化系统来连接 js 文件和模板。似乎缺少从模板中访问实际模板名称的低级支持,因此这变得很困难。我写了一个小模板标签添加到模板的底部手动包含 js 并将其包装在适当的样板中..【参考方案2】:

在处理JS代码时,首先要分析页面加载时是否会立即使用。如果它没有立即使用(意味着用户必须做一些事情来调用它),你应该将它打包到一个 JS 文件中并稍后包含它,以便用户更快地感知加载时间。这意味着用户将看到的任何内容都应该首先出现,并且与功能相关的 JS 应该在文件末尾附近导入。 下载此工具来分析您的网站:http://getfirebug.com/ 如果 JS 代码足够小,它应该与 HTML 内联。 希望对您有所帮助。

【讨论】:

【参考方案3】:

对于像这样的快速小用户界面,我将所有内容都放入一个单独的 javascript 文件中,该文件包含在每个页面上。然后在 javascript 文件中检查页面上存在的内容并相应地运行代码。例如,我可能在UIMagic.js 中有这个。我有 jQuery,如果你不熟悉这些 jQuery 主义,请原谅。

function setupMenuHover() 
  if ($("li.menu").length)  // The page has a menu
    $("li.menu").hover(function()  ... , function()  ... );
  

$(setupMenuHover);

function setupFacebookWizbang() 
  if (typeof FB != "undefined")  // The page has Facebook's Javascript API
    ...
  

$(setupFacebookWizbang);

我发现这是一种足够理智的方法。

【讨论】:

【参考方案4】:

我的首选方法是将内联 javascript 存储在它自己的文件中(以便我可以通过语法高亮等轻松编辑它),然后通过直接加载内容将其包含在页面中:

'<script type="text/javascript">'+open('~/js/page-inline.js').read()+'</script>'

这可能表现不佳,除非你的模板库可以缓存这种东西。

使用 Django,您可能只需要 include js 文件:

<script type="text/javascript">
    % include "js/page-inline.js" %
</script>

不确定是否缓存了输出。

如果您仍然担心“脏”,那么您可以查看以下项目,它们试图弥合服务器/客户端语言不匹配:

http://pyjs.org/(Python 生成 JavaScript)

http://code.google.com/webtoolkit/(Java 生成 JavaScript)

http://nodejs.org/(一直是 JavaScript!)

【讨论】:

以上是关于在主要“肉”仍然是服务器端的 webapps 中组织 JS 代码的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

webAPP如何实现移动端拍照上传(Vue组件示例)?

常被人忽略的顽疾之一!!!你不知道的冷知识

粗浅看 移动端的WebApp发展之H5的无限活力

js学习总结----webapp之使用less构建响应式布局

React 打包部署多级目录实践

URL在Tomcat服务器端的解析过程