我正在为NodeJS使用ExpressJS Web框架。
使用ExpressJS的人将他们的环境(开发,生产,测试…),路线等放置在app.js
。我认为这不是一个好方法,因为当您拥有大型应用程序时,app.js太大了!
我想要这个目录结构:
| my-application
| -- app.js
| -- config/
| -- environment.js
| -- routes.js
这是我的代码:
app.js
var express = require('express');
var app = module.exports = express.createServer();
require('./config/environment.js')(app, express);
require('./config/routes.js')(app);
app.listen(3000);
config / environment.js
module.exports = function(app, express){
app.configure(function() {
app.use(express.logger());
});
app.configure('development', function() {
app.use(express.errorHandler({
dumpExceptions: true,
showStack: true
}));
});
app.configure('production', function() {
app.use(express.errorHandler());
});
};
config / routes.js
module.exports = function(app) {
app.get('/', function(req, res) {
res.send('Hello world !');
});
};
我的代码运行良好,我认为目录的结构很漂亮。但是,必须对代码进行修改,但我不确定代码是否良好/美观。
使用我的目录结构并修改代码还是仅使用一个文件(app.js)更好?
感谢您的建议!
好的,已经有一段时间了,这是一个很普遍的问题,所以我继续前进,创建了一个带有JavaScript代码的脚手架github存储库,以及关于我喜欢如何构造一个中型express.js应用程序的自述文件。
focusaurus /
express_code_structure
是具有最新代码的存储库。拉请求欢迎。
这是自述文件的快照,因为stackoverflow不喜欢仅链接的答案。我将进行一些更新,因为这是我将继续更新的新项目,但是最终github存储库将是此信息的最新信息。
该项目是如何组织中型express.js Web应用程序的示例。
当前至少要表达v4.14 2016年12月
Web应用程序并不完全相同,在我看来,没有一个单一的代码结构可以应用于所有express.js应用程序。
如果您的应用程序很小,则不需要此处示例的深层目录结构。只需保持简单,然后将少量.js
文件粘贴到存储库的根目录即可。Voilà。
如果您的应用程序很大,则有时需要将其分解为不同的npm软件包。通常,node.js方法似乎倾向于使用许多小软件包,至少对于库而言是如此,并且您应该通过使用几个npm软件包来构建应用程序,因为这开始变得有意义并证明了开销。因此,随着应用程序的增长以及部分代码在应用程序外部或作为清晰的子系统可以清楚地重用,请将其移至其自己的git存储库中,并将其放入独立的npm包中。
因此 ,该项目的重点是说明中型应用程序的可行结构。
构建Web应用程序的方法有很多,例如
所有这些都很好地适合于不同的目录结构。就本示例而言,它只是脚手架,而不是一个完全正常运行的应用程序,但我假设以下关键体系结构要点:
在整个项目中,将成为一个主题,Ruby on Rails所体现的许多想法及其采纳的“ Convention over
Configuration”决策尽管被广泛接受和使用,但实际上并没有什么帮助,有时与该存储库相反推荐。
我在这里的主要观点是,组织代码具有一些基本原则,基于这些原则,Ruby on Rails约定(大多数情况下)对Ruby on
Rails社区有意义。但是,仅仅不加思索地修改这些约定就没有意义。一旦掌握了基本原理,您的所有项目都将井井有条,清晰:shell脚本,游戏,移动应用程序,企业项目,甚至您的主目录。
对于Rails社区,他们希望能够有一个Rails开发人员从一个应用程序切换到另一个应用程序,并且每次都熟悉并感到满意。如果您是37个信号机或Pivotal
Labs,这非常有意义,并且有好处。在服务器端JavaScript世界中,总体上讲,风风雨雨更像西方,我们对此并不存在任何问题。我们就是这样滚动的。我们已经习惯了。即使在express.js中,它也是Sinatra的近亲,而不是Rails,并且从Rails获得约定通常无济于事。我什至要说
原则胜于约定胜于配置 。
app/node_modules
目录,并package.json
在 原型模块 目录中包含文件,以促进这种过渡并起到提醒作用。app
目录中,因此您可以cd
运行find / grep / xargs / ag / ack / etc并不受第三方匹配的干扰kebab-case
,即使必须是对JavaScript中的变量名camelCase
,因为-
在JavaScript中有一个减号。kebab-case
转换为camelCase
app/views
,app/controllers
,app/models
,等routes.rb
如果您想了解应用程序中所有路径的概述,可以使用Rails样式的文件,但是在实际构建功能和修复错误时,您只关心与要更改的零件相关的路径。app/users
其中的可能性变得更大,因为到处都没有耦合业务逻辑的棘手问题,这污染了用户代码库的纯度。app/server.js:1
您可以按照以下代码查看加载和执行的所有内容。magicRESTRouter.route(somecontroller, {except: 'POST'})
是一个巨大的胜利为你在3个基本app.get
,app.put
,app.del
,电话,你可能会建立一个整体的应用程序,是太大了有效工作的。赢得大笔大奖,而不是将3条简单的线转换为1条复杂的线。使用小写字母的文件名
不要使用app.configure
。它几乎完全没有用,您只是不需要它。由于盲目复制,它在很多样板中。
紧急情况下中途和路线的顺序!!!
app.use
如果您真的只需要2条路由的中间件,就不要使用整个应用程序(我在看着您body-parser
)server.js
,并且将清楚地说明它们的顺序。对于中型应用程序,将内容分解为单独的路由模块是不错的选择,但这确实会带来无序中间件的危险社区在针对Node.js的更好的本地更好的require()路径中概述并讨论了许多方法。我可能很快会决定选择“只处理大量的../../../
..”还是使用requireFrom模块。但是,此刻,我一直在使用下面详述的symlink技巧。
因此,避免require("../../../config")
使用类似恼人的相对路径来避免项目内需求的一种方法是使用以下技巧:
.gitignore
文件中仍应包含“ node_modules”var config = require("app/config");
var DealModel = require("app/deals/deal-model")
;通常,代码模块和类仅希望options
传入基本JavaScript
对象。仅app/server.js
应加载app/config.js
模块。从那里可以options
根据需要合成小对象以配置子系统,但是将每个子系统耦合到一个充满额外信息的大型全局配置模块上,则是不好的结合。
尝试集中创建数据库连接并将其传递到子系统中,而不是传递连接html" target="_blank">参数并让子系统自己进行传出连接。
这是Rails提出的另一个诱人但可怕的想法。您的应用中应该恰好有1个位置,app/config.js
它可以查看NODE_ENV
环境变量。其他所有内容都应采用显式选项作为类构造函数参数或模块配置参数。
如果电子邮件模块具有关于如何传递电子邮件的选项(SMTP,登录到stdout,放入队列等),则应采用类似的选项,{deliver: 'stdout'}
但绝对不要选中NODE_ENV
。
现在,我将测试文件与其对应的代码保存在同一目录中,并使用文件扩展名命名约定将测试与生产代码区分开。
foo.js
具有模块“ foo”的代码foo.tape.js
具有针对foo的基于节点的测试,并位于同一目录中foo.btape.js
可以用于需要在浏览器环境中执行的测试我使用文件系统全局文件和find . -name '*.tape.js'
命令来根据需要访问所有测试。
.js
模块文件中组织代码这个项目的范围主要是关于文件和目录的位置,我不想添加其他范围,但是我只想提到我将代码分为3个不同的部分。
问题内容: 对于这个问题,我实际上并没有太多的摆动或GUI设计方面的经验(大学中的一些WPF应用程序的水平差不多),但是我的任务是在工作中重构摆动旧式应用程序的一部分。 我被要求重构的部分围绕一个弹出窗口,该窗口可以根据特定的值对象以三种不同的格式显示。这3种不同的格式都共享一些基本字段,然后有条件地确定其他字段。负责此GUI元素的类的长度约为5k,我当时认为应该将其分为三个子类,并在基类中共享这
问题内容: 是否有在 Express.js 应用程序中分解和模块化文件的通用约定?还是将所有内容保存在一个文件中很普遍? 问题答案: 我的分解如下: 我使用Exports返回相关内容。例如,在模型中,我这样做: 然后,如果我需要创建一个电话号码,则非常简单: 如果我需要使用架构,那么 (假设我们正在routes文件夹中工作,需要先上一层然后再下一层模型) 编辑4 该 快递维基 具有建立在它之上的框
问题内容: 我通常在Linux系统上工作,但遇到一种情况,我需要编写一个客户端应用程序,该应用程序可以作为服务在Windows上运行。有人可以帮助我或指导我如何在Windows环境下构建MenuBar应用程序(例如Dropbox),该应用程序从操作系统启动开始,图标位于TaskBar中,然后单击该应用程序图标将显示一个菜单。 我的脚本语言是python。谢谢。 问题答案: 您可以使用pywin32
一个普通的应用程序由以下文件组成: 二进制文件 这个安装在 /usr/bin。 一个桌面文件 这个桌面文件向shell提供关于这个程序的重要信息,例如名称、图标、D-Bus名称,启动的命令行。安装在 /usr/share/applications. 一个图标 这个图标安装在 /usr/share/icons/hicolor/48x48/apps, 无论当前背景是什么系统都会到这里查找图标。 一个设
问题内容: 我想开始用Java进行Web开发。我不知道如何开始,学习什么或学习和使用的最佳Web框架是什么。帮帮我? 问题答案: 我认为,您只是Web应用程序的新手,而不是Java本身的新手。 首先,我可以为前端推荐Apache Wicket框架。他们的网站上有很多示例,邮件列表是上手的好地方,而Wicket in Action 是令人愉快的阅读。 如果要使用Java Server Pages(J
问题内容: 我要做的是为我的Java应用程序构建一个docker映像,但是以下注意事项对于大多数编译语言都应适用。 在构建服务器上,我想为应用程序生成一个docker映像作为可交付成果。为此,我必须使用一些构建工具(通常是Gradle,Maven或Ant)来编译应用程序,然后将创建的JAR文件添加到docker映像中。因为我希望Docker映像仅执行JAR文件,所以我当然将从已安装Java的基本映