服务器端JavaScript最佳实践?

5
我们有一个基于Java构建的CMS,并且它在服务器端使用Mozilla Rhino来处理JS。目前,JS代码库还很小,但正在不断增长。在代码变得混乱之前,我想引入一些最佳实践和编码风格。
显然,名称空间控制非常重要。但是其他最佳实践 - 特别是对于Java程序员来说呢?

2
现在将它移植到Node.js太晚了吗? - Nosredna
使用node.js有哪些好处? - Petteri H
我今天刚开始使用nodejs,并编写了我的第一个小型文档服务器(在我工作的各种持续集成任务中需要)。之前我看过rhino,但我认为nodejs更简单易用。 - jeremyosborne
请查看《JavaScript权威指南》。 - Catharsis
1
最佳实践是由写书的人提出的意见。这个问题主要基于个人观点,应该被关闭。 - Heretic Monkey
3个回答

20

以下是一些来自前线的技巧:

  • 像 Java 一样,在函数中使用 Doxygen/JsDoc 风格的文档块。
  • 进行单元测试。个人喜欢 JsTestDriver,因为它也可以从 CI 服务器自动执行。
  • 使用 JSLint。它会挑剔不良代码。
  • 考虑使用 Google Closure Compiler。它会和 JSLint 一样挑剔代码,但它有助于发现糟糕的文档块等问题。
  • 确保团队中的每个人都了解闭包的工作原理。否则会导致头疼。
  • 正如你提到的,名称空间很重要,特别是如果你想让你的代码与其他 JS 库良好地配合使用(var myns = myns || {};)。
  • 个人认为使用一个提供类等 OOP 助手的库会很有帮助。你可以使用原型继承,但通常这种方式更加棘手。

1
+1 给你。我原本想写自己的答案,但简单的事实是,你已经涵盖了大部分常见的观点,尽管它们很简单,但没有人真正做到。我可以重申一下第一和第二个要点吗?我不知道 JS 开发者在想什么,就好像他们认为因为他们写 JavaScript,就可以逃避良好的编程实践。 - jeremyosborne
我能重申一下JSLINT的建议,并补充说这应该替换任何持续集成设置中的编译步骤。如果代码未通过JSLINT检查,则不应将其提交到存储库中。有些人不同意JSLINT执行的某些检查,但我必须强调以这种方式集成JSLINT将防止语法错误(破坏原本正常工作的代码)被纳入产品中。 - Breton
请确保使用JSLint而不是Javascript lint。它们是两个不同的产品。并不是说javascript lint不好,但它无法捕获隐式全局变量,而JSLINT可以。您的代码不应该有任何您不知道的隐式全局变量。JSLint还提供了一种方法,让您在特殊格式的注释中声明所有已知的全局变量。无论是否使用jslint,将此注释放在每个.js文件的开头都非常有用。 - Breton
还有几件事情需要补充:尝试使用一个可以作为扩展运行javascript代码的IDE,并熟悉这个功能。Eclipse就是这样的IDE之一。通过这种方式,您可以将诸如JSLINT之类的工具直接整合到您的代码编辑环境中。一旦您做到了这一点,您还可以使用http://jsbeautifier.org/、http://boyopeg.googlepages.com/jsmeter.html、您最喜欢的缩小器/编译器,以及您将能够编写自己的代码修改工具来强制执行其他任何编码标准。 - Breton
1
不要忽视文件命名、作用域和文件夹组织标准。 - Breton

2

正如Douglas Crockford所说,JavaScript是世界上最被误解的编程语言。尽管许多人不知道,但是在JavaScript中有一种正确的编码方式。我毫不怀疑,如果你让Java开发人员在理解如何编写良好的JavaScript之前开始编码,那么你将遇到严重的问题。

首先要做的是确保每个人都阅读了Mozilla的优秀文章“重新介绍JavaScript” (https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/A_re-introduction_to_JavaScript)。JavaScript最大的问题之一是有许多方法可以完成大多数常见任务,而这篇文章应该可以让大家达成共识。另一个必要的参考资料是Douglas Crockford的作品,包括“JavaScript: The Good Parts”。

还有一件事情经常困扰着许多Java/C++程序员,那就是JavaScript使用函数作用域而非块级作用域。这可能会导致一些非常棘手的问题。关于这个问题,A List Apart有一篇很棒的文章叫做“JavaScript中的绑定”。


  • 如何使用原型继承编写面向对象代码(而非基于类的继承)
  • 如何使用闭包和Lambda表达式
  • 如何利用动态对象的威力
  • 如何编写函数作用域代码

1

由于Java中有JS引擎,请养成为JS代码编写单元测试的习惯。选择一种编码风格并严格遵守。如果可能,使用工具检查代码是否符合编码风格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接