11

我一直认为在服务器上使用 NodeJS 的一大好处是可以在服务器端和客户端之间共享一些代码(例如输入验证)。既然我实际上是在使用 NodeJS 进行开发,我发现的一个困难是确定执行每个代码主体的职责和上下文。下面我将列出我遇到的一些困难,希望对我可能忽略的有助于提升这些问题的约定或指导有所启发。

构建时代码

以遵循基本文档的方式使用 Gulp、Grunt 或 vanilla NPM 的项目的构建时间代码通常很容易遵循。大多数较小的项目倾向于将所有代码保存在一个文件中,并且该文件往往被命名为 gulpfile.js 之类的常规名称,但是对于较大的项目,我已经看到这些脚本开始被拆分。我见过一些情况,其中 gulp 文件被拆分为多个文件并放在单独的目录下。更糟糕的是,我发现 gulpfile.js 文件甚至没有被命名为这样的情况,这导致新开发人员四处寻找 gulpfile 所在的位置,一旦找到,gulp 命令总是必须使用特定的- -gulpfile选项。

运行时服务器端代码

基本节点应用程序的入口点似乎只需要在运行节点命令时指出一个特定的 JavaScript 文件(例如node script.js)。对于 Web 服务器应用程序,例如使用Express的应用程序,我注意到按照惯例,入口点文件通常称为 server.js,通常可以在应用程序的根目录中找到。然而,在其他一些情况下,例如在开发人员环境中运行 Web 服务器时,我看到 gulp 任务承担了启动 Node.js 的责任。在这些情况下,似乎有多种方法可以包含入口点,但我发现的一个示例是启动 webpack 编译器,然后是require入口点脚本的语句。在这种类型的设置中,弄清楚如何合并有关如何完成典型节点调试命令的常规指导并非易事。除了应用程序的入口点之外,似乎没有任何关于 NodeJS/Express 应用程序目录结构的一般指导,将服务器端特定代码保留在其位置以帮助定位它并将其与构建时分开,并且客户端代码。

如果服务器端代码用于提供静态内容、服务器端生成的视图(例如使用 MVC)以及为客户端提供 API,服务器端的故事会变得更加复杂边。我的偏好是将 API 从应用程序项目中分离出来,但我从其他人那里得到的感觉是这样做涉及到一种过于复杂的感觉,我认为这是一种合理的关注点分离。

运行时客户端代码

由于客户端代码通常可以根据请求的第一页有各种入口点,这可能会很棘手。然而,由于 URL 的一般透明度以及它们如何映射到典型情况下的资源以及调试工具在现代浏览器中变得多么强大,因此遵循脚本并没有太大的麻烦。相反,客户端代码的困难更多的是典型的构建过程,这些过程通常最终复制文件并将它们以不同的名称放入类似生产的结构中。例如,一个项目有一个名为srcjs的文件夹它将客户端和服务器端代码混合在一起,除了只有一部分文件碰巧包含在构建任务中,该构建任务转换并经常连接文件并将它们放置在分发文件夹中。我见过的这些分发文件夹的常用名称是distpublicwwwwwwroot。通常(如果不总是)这些目录位于项目的根目录下,这至少使它更容易定位,而无需询问构建脚本。

我希望有一些关于如何以理智的方式将所有这些放在一起的一般性指导,也许是由权威来源提供的,主要是为了给像我这样可能想要从正确开始的人提供指导。作为一个副作用,也许能够参考某种标准,即使它是一个松散的标准,也可以减少团队在开始时必须发明和讨论的样板数量。在上面列出的每个上下文中,显然会有一些特定于技术的约定,例如客户端的 AngularJS、Meteor 或 ReactJS 遵循的约定。我正在寻找的约定更具体地用于分离端到端 JavaScript 应用程序中的主要高级上下文,其中语言和平台不再成为区分两者的明显方式。

4

1 回答 1

7

构建时代码

恕我直言,如果您有太多的构建时代码,以至于超过 1000 行并且需要多个文件,那么有些东西已经脱离了轨道。要么您不知道如何充分利用 npm 中的现有包,要么您不了解如何重构通用代码并作为独立的 npm 包发布。如果您觉得需要有关项目构建时代码的指导,因为它是如此庞大和复杂,我的建议是模块化并拆分为单独的项目 - 每个项目独立发布到 npm。也只需检查您的整体方法。你在做什么这么定制,需要这么多机器?

运行时服务器端代码

请参阅我对ExpressJS 如何构建应用程序的其他回答?

一般来说,我宁愿看到客户端代码和服务器端代码完全独立的 npm 包(单独的 git repos,单独的 package.json 文件,独立发布)(如果它们足够大)或者以其他方式混合在同一个模块中并分组通过耦合(与功能相关的所有代码,包括前端和后端代码),特别是如果您的代码库有大量代码可以在两种环境中工作。

我有一个名为mjournal的开源全栈节点/JS 应用程序,它可以将浏览器代码和节点代码放在一起。您可以看一下,看看它是否对您来说合乎逻辑并且易于理解代码所在的位置。这绝不是一种流行的方法,所以很多人会不喜欢它,但我个人感觉很好,因为我已经接受了“通过耦合分组”作为一般原则。

在这种类型的设置中,弄清楚如何合并有关如何完成典型节点调试命令的常规指导并非易事

是的,那是胡说八道。npm start您的应用程序应以node server.js. 使新开发人员感到困惑的精心设计的 gulp/grunt 设置是您应该消除的不必要的复杂性。

在服务器端代码同时用于提供静态内容的情况下,服务器端的故事变得更加复杂

根据我的经验,提供静态内容的代码可以归结为 5 行或更少,所以没什么大不了的。如果您有处理提供静态内容的非微观代码量,那么有些事情又偏离了轨道。

运行时客户端代码

我希望有一些关于如何以理智的方式将所有这些放在一起的一般性指导,也许是由权威人士提供的,主要是为了给像我这样可能想要从正确开始的人提供指导。

节点社区中有一些人采用了 Ruby on Rails、EmberJS 和其他一些大型项目使用的“约定优于配置”的方法。如果您喜欢这种方法,请查看使用它的工具,例如 SailsJS、EmberJS、Yeoman 生成器等。

但总的来说,寻找“标准”并不是 node.js/javascript/web 社区的运作方式。小型 npm 包。由于体积小而被迫显而易见的文件布局。由于前端工具链如此复杂,我感到您对此感到沮丧,但归根结底是因为浏览器中的 JavaScript 花了几十年的时间来创建一个合理的模块系统。既然 ES6 模块是官方规范,那么事情可能在未来几年开始标准化,但是已经用 CommonJS 编写了这么多代码,而且它是 RequireJS/AMD 等可怕的前身,我们可能会在可预见的未来处理它们。

于 2015-10-26T05:49:01.907 回答