文件和文件夹的Node.js项目命名约定


115

大型Node.js项目中文件和文件夹的命名约定是什么?

我应该大写,驼峰式还是下划线?

就是 这被认为有效吗?

project-name
    app
        controllers
            someThings.js
            users.js
        models
                someThing.js
                user.js
        views
            some-things
                index.jade
            users
                logIn.jade
                signUp.jade
    ...

3
主观上,您的目录结构是您自己的。我个人比较喜欢camelCase,因为那是我在JS中所做的
乍得

@Chad-在Node.js中,require将目录字符串作为参数,这就是为什么它不完全属于您自己的原因。即。require('../app/controllers/someThings');
Rudiger

3
Node没有为模块命名指定任何建议或标准,只要它们是有效的文件/目录名称并且不要尝试覆盖核心模块名称即可。对于其自己的模块,它使用缩写(fs),单字(events),下划线(child_process)和小写(querystring)的组合。
乔纳森·洛诺夫斯基

1
@Rudiger那么?您可以指定所需的任何字符串以及所需的目录结构(当然,前提是您的名称是有效的文件名)。
2013年

从我可以发现的比较关键的项目中可以看出,像mocha这样的文件名,例如captain-awesome-file.js似乎很常见。那就是我至少要用的!
Charles Ferentchak 2014年

Answers:


153

在使用node几年之后,我可以说目录/文件结构没有约定。但是,大多数(专业)快递应用程序都使用类似以下的设置:

/
  /bin - scripts, helpers, binaries
  /lib - your application
  /config - your configuration
  /public - your public files
  /test - your tests

使用此设置的示例是nodejs-starter

我个人将此设置更改为:

/
  /etc - contains configuration
  /app - front-end javascript files
    /config - loads config
    /models - loads models
  /bin - helper scripts
  /lib - back-end express files
    /config - loads config to app.settings
    /models - loads mongoose models
    /routes - sets up app.get('..')...
  /srv - contains public files
  /usr - contains templates
  /test - contains test files

在我看来,后者与Unix风格的目录结构更好地匹配(而前者将其混为一谈)。

我也喜欢这种模式来分隔文件:

lib / index.js

var http = require('http');
var express = require('express');

var app = express();

app.server = http.createServer(app);

require('./config')(app);

require('./models')(app);

require('./routes')(app);

app.server.listen(app.settings.port);

module.exports = app;

lib / static / index.js

var express = require('express');

module.exports = function(app) {

  app.use(express.static(app.settings.static.path));

};

这允许将所有源代码整齐地解耦,而不必理会依赖项。一个很好的解决讨厌的Javascript的解决方案。附近有一个使用此设置的真实示例。

更新(文件名):

关于文件名最常见的是短的小写的文件名。如果您的文件只能用两个词来描述,那么大多数JavaScript项目都使用下划线作为分隔符。

更新(变量):

关于变量,相同的“规则”适用于文件名。但是,原型或类应使用camelCase

更新(样式指南):


26
您的答案有多么有趣和做得好,这与主题无关,主题创建者专门要求命名约定而不是目录结构。当涉及到本主题时,我们希望知道文件是否用破折号,下划线或camelCase更好地命名。如果将其添加到此答案中,我将投票。
Tronix117 2014年

3
@ Tronix117是什么问题?该问题要求“文件和文件夹的项目命名约定?” 命名不限于文件名,因为它还包括完整的路径名。
bodokaiser 2014年

23
当然,但是作者特别询问“我该使用大写字母,camelCase还是下划线?”。当他写示例时,他明确地放置了“ someThings”和“ some-things”只是为了知道它是否可以被认为是有效的。当我进入这个主题时,我期望得到这个特定问题的答案,并知道什么通常用作文件命名。我并不是说您的答案是错误的,它的目的是完美的,但是在我看来并不完整,因为他并没有真正回答主要问题。
Tronix117 2014年

5
我想你误解了我;)。我只是在寻找无法在接受的答案中找到的东西,而是被特别问到,没有以任何形式散布仇恨,您在这个问题上走得有点远。我只是想让您在答案上添加一些有关此的信息,以便将来寻找该信息的人不会陷入僵局。
Tronix117 2014年

2
@ Tronix117实际上,这就是为什么我在此页面上阅读此答案后才发现自己的原因。我不仅希望目录结构,而且希望更重要的名称约定(破折号,下划线,camelCase,TitleCase等...)。不幸的是,答案仍然没有包含它,似乎bodokaiser我个人觉得太麻烦了,无法请求他对这个问题的看法添加到他的答案中(正如OP在他们的问题中最初提出的那样)(咳嗽 咳嗽)。
旋转

97

使用kebab-case所有的包,文件夹和文件名。

为什么?

您应该想象有一天某个文件夹或文件可能会提取到其自己的程序包中。软件包不能包含大写字母。

新软件包名称中不得包含大写字母。 https://docs.npmjs.com/files/package.json#name

因此,camelCase永远不要使用。这树叶snake_casekebab-case

kebab-case是迄今为止最常见的约定。下划线的唯一用途是用于内部节点程序包,这只是早期的惯例。


2
你忘了点吗?像socket.io
Roee

1
.2c,可以使用正则表达式在任何脚本或应用程序中以任何语言以任何语言从kebab-case到kebabCase进行简单的自动化-一直做到🙃–
rob2d

63

没有约定。有一些逻辑结构。

我只能说的一件事:永远不要使用camelCase文件和目录名称。为什么?它可以工作,但在Mac和Windows上,someAction和some action之间没有区别。我遇到了这个问题,而且一次都没有。我需要这样的文件:

var isHidden = require('./lib/isHidden');

但是可悲的是,我创建了一个包含小写字母的文件:lib/ishidden.js。它在Mac上对我有用。在我的同事的Mac上运行正常。测试运行没有错误。部署后,我们遇到了一个巨大的错误:

Error: Cannot find module './lib/isHidden'

哦耶。这是一个Linux系统。因此,camelCase目录结构可能很危险。对于在Windows或Mac上进行开发的同事来说就足够了。

因此,如果需要,请使用下划线(_)或破折号(-)分隔符。


4
+1,添加以下事实:在非CS系统上的git中重命名区分大小写的文件夹确实很麻烦。
最高

4
我在这里不太了解camelCase的问题。不能通过首先正确命名文件(lib / isHidden.js)解决此问题吗?
迈克

嗨,迈克,关键是在某些系统上,camelCase的部署将中断。当我从Mac部署到带有“ groupPages”软件包的Linux机器上时,为什么我的目录都得到404,我感到困惑。我不得不更改为小组页面来解决问题。
tempranova'2

3
更糟糕的是:创建文件名的驼峰版本,并且让一个粗心的同事在同一目录中创建小写版本。现在,在不区分大小写的操作系统中进行检查,并尝试找出导致应用程序无法正常工作的原因。是的,这发生了。
L0LN1NJ4 2015年

我喜欢这个答案,但是我想指出破折号(-)也可能有一些问题。例如,使用Nighwatch测试框架,我创建了一个名为admin-login.js的页面对象。然后,我尝试使用从测试脚本中访问它const loginPage = browser.page.admin-login()。我出错了ReferenceError: login is not defined。使用下划线(_)作为文件名可以解决此问题。我也可以想象在命令行中使用带有破折号的文件名也会导致一些问题。因此,我想说下划线通常是文件名最安全的分隔符。
Dragan Nikolic


3

大多数人camelCase在JS中使用。如果您想开源任何东西,我建议您使用这个:-)


一些项目(例如Locomotive.js)camelCase用于控制器文件。:-)取决于。我倾向于使用PascalCase类文件。
Mathieu Amiot 2014年

@yitsushi似乎引起了骆驼(和帕斯卡)大小写问题的关注,如果您想创建便携式模块,骆驼的情况肯定是个坏主意?
gumaflux 2014年

0

Node.js不执行任何文件命名约定(除外index.js)。Java语言通常也不是。您可以在此处找到许多线索,这些线索暗示了camelCase,连字符和下划线,它们中的任何一个都可以很好地工作。因此,取决于您。选择一个并坚持下去。


1
这其实不是什么节点“强制实施”,请仔细阅读本:nodejs.org/api/modules.html#modules_folders_as_modules
莫卡

0

据我说:对于文件,如果module.exports是一个对象,请使用小写驼峰,我的意思是单例模块。这也适用于JSON文件,因为它们也是单吨形式。如果module.exports返回一个构造函数,其作用类似于类,请使用大写驼峰形式。

对于文件夹,请使用短名称。如果需要多个单词,请使用“-”将其完全小写,以使其在所有平台上均能正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.