【问题标题】:Node.js project naming conventions for files & folders文件和文件夹的 Node.js 项目命名约定
【发布时间】:2013-09-26 11:07:08
【问题描述】:

大型 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
    ...

【问题讨论】:

  • 非常主观,您的目录结构是您自己的。我个人喜欢 camelCase,因为这是我在 JS 中所做的
  • @Chad - 在 Node.js 中,require 将目录字符串作为参数,这就是为什么它不是完全你自己的。 IE。 require('../app/controllers/someThings');
  • Node 没有为命名模块指定任何建议或标准,只要它们是有效的文件/目录名称并且不要尝试覆盖 core module names。对于自己的模块,它混合使用缩写 (fs)、单字 (events)、下划线 (child_process) 和小写 (querystring)。
  • @Rudiger 所以?你可以指定你想要的任何字符串,以及你想要的目录结构(当然前提是你的名字是有效的文件名)。
  • 从我发现更多的关键项目如mocha 文件名如 Captain-awesome-file.js 似乎很常见。这就是我至少要使用的!

标签: javascript node.js naming-conventions


【解决方案1】:

Node.js 不强制执行任何文件命名约定(index.js 除外)。 Javascript 语言通常也没有。你可以在这里找到几十个暗示驼峰式、连字符和下划线的线程,其中任何一个都可以很好地工作。所以这取决于你。选择一个并坚持下去。

【讨论】:

【解决方案2】:

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

【讨论】:

  • 一些项目,例如 Locomotive.js 使用 camelCase 来存储控制器文件。 :-) 只是取决于。我倾向于将PascalCase 用于类文件。
  • @yitsushi 似乎对骆驼(和帕斯卡)案例命名提出了相当大的关注,如果你想创建可移植模块骆驼案例肯定是个坏主意?
【解决方案3】:

在使用 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 的一个非常好的解决方案。一个真实的例子是nearby,它使用了这个设置。

更新(文件名):

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

更新(变量):

关于变量,同样的“规则”适用于文件名。然而,原型或类应该使用 camelCase

更新(样式指南):

【讨论】:

  • 您的回答多么有趣和出色,这是题外话,主题创建者专门要求命名约定而不是目录结构。当我们谈到这个话题时,我们希望知道文件用破折号、下划线还是驼峰命名是否更好。如果将此添加到此答案中,我将投票赞成。
  • @Tronix117 有什么问题?问题询问“文件和文件夹的项目命名约定?”并且命名不限于文件名,它还包括完整的路径名。
  • 当然可以,但是作者特别问“我应该大写、驼峰式还是下划线?”。当他写他的例子时,他明确地输入了“someThings”和“some-things”,只是为了知道它是否可以被认为是有效的。当我谈到这个话题时,我期望得到这个特定问题的答案,并知道通常用作文件命名的内容。我并不是说你的答案是错误的,它的目的是完美的,但在我看来是不完整的,因为他并没有真正回答主要问题。
  • 我想你误会了我;)。我只是在寻找一些我在接受的答案中没有找到的东西,但有人特别问我,不要以任何形式传播仇恨,你在这个问题上走得有点远。我只是希望您在答案中添加一些有关此的信息,以便将来寻找该问题的人不会陷入死胡同。
  • @Tronix117 实际上,这就是为什么我发现自己在此页面上阅读此答案的原因。我不仅希望目录结构,而且更重要的是命名约定(破折号、下划线、camelCase、TitleCase 等)。不幸的是,答案仍然不包含它,而且似乎bodokaiser 过于个人化,我无法介入并要求将他对此的意见添加到他的答案中(正如 OP 最初在他们的问题中提出的那样)(咳嗽 咳嗽)。
【解决方案4】:

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

我只能说一件事: 切勿使用 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 上开发的同事来说已经足够了。

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

【讨论】:

  • +1,添加一个事实,在非 cs 系统上重命名 git 中区分大小写的文件夹确实很麻烦。
  • 我不太明白camelCase 的问题。首先正确命名文件(lib/isHidden.js)不会解决问题吗?
  • 嘿,迈克,关键是camelCase 在某些系统上的部署会中断。当我从 Mac 部署到带有名为“groupPages”的包的 Linux 机器上时,我对为什么我的目录都得到 404 感到困惑。我不得不更改为组页面来解决问题。
  • 更糟糕的是:创建一个文件名的驼峰版本,并让一个粗心的同事在同一目录中创建一个小写版本。现在在不区分大小写的操作系统中进行检查,并尝试找出您的应用程序无法正常工作的原因。是的,这发生了。
  • 我喜欢这个答案,但是我想指出破折号 (-) 也可能有一些问题。例如,使用 Nightwatch 测试框架,我创建了一个名为 admin-login.js 的页面对象。然后我尝试使用const loginPage = browser.page.admin-login() 从测试脚本中访问它。我收到错误ReferenceError: login is not defined。使用下划线 (_) 作为文件名解决了这个问题。我也可以想象在命令行中使用带有破折号的文件名也会导致一些问题。因此,我想说下划线是一般文件名最安全的分隔符。
【解决方案5】:

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

对于文件夹,请使用短名称。如果需要有多个单词,让它完全小写,用“-”分隔,这样它就可以在所有平台上一致地工作。

【讨论】:

    【解决方案6】:

    对所有包、文件夹和文件名使用kebab-case

    为什么?

    您应该想象有一天任何文件夹或文件都可能被提取到自己的包中。包不能包含大写字母。

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

    因此,永远不应使用camelCase。这留下了snake_casekebab-case

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

    【讨论】:

    • 你忘了点?像socket.io
    • .2c,可以使用正则表达式在任何语言的任何脚本或应用程序中进行从 kebab-case 到 kebabCase 的简单自动化——一直这样做?
    • node_modules 是我坚持使用蛇盒的原因。
    【解决方案7】:

    基于“Google JavaScript Style Guide

    文件名必须全部小写,并且可以包含下划线 (_) 或 破折号 (-),但没有额外的标点符号。遵循约定 您的项目使用。文件名的扩展名必须是 .js。

    【讨论】:

      猜你喜欢
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 2012-04-27
      相关资源
      最近更新 更多