หลักการตั้งชื่อโปรเจ็กต์ Node.js สำหรับไฟล์และโฟลเดอร์


119

หลักการตั้งชื่อไฟล์และโฟลเดอร์ในโปรเจ็กต์ Node.js ขนาดใหญ่มีอะไรบ้าง

ฉันควรใช้ตัวพิมพ์ใหญ่ camelCase หรือ under-score?

ได้แก่ . ถือว่าใช้ได้ไหม

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
โหนดไม่ได้ระบุข้อเสนอแนะหรือมาตรฐานใด ๆ สำหรับการตั้งชื่อโมดูลเพียงตราบเท่าที่พวกเขาชื่อไฟล์ที่ถูกต้อง / directory กำลังและไม่พยายามที่จะแทนที่ชื่อโมดูลหลัก สำหรับโมดูลของตัวเองจะใช้การผสมระหว่างตัวย่อ ( fs), คำเดี่ยว ( events), ขีดล่าง ( child_process) และตัวพิมพ์เล็ก ( querystring)
Jonathan Lonowski

1
@Rudiger งั้นเหรอ? คุณสามารถระบุสตริงที่คุณต้องการและโครงสร้างไดเร็กทอรีที่คุณต้องการได้ (แน่นอนว่าชื่อของคุณเป็นชื่อไฟล์ที่ถูกต้อง)
ชาด

จากสิ่งที่ผมสามารถบอกได้จาก poking รอบโครงการหลักสำคัญมากขึ้นเช่นมอคค่าชื่อไฟล์เช่นกัปตันน่ากลัว-file.js ดูเหมือนจะมากพอที่พบบ่อย นั่นคือสิ่งที่ฉันจะใช้อย่างน้อยที่สุด!
Charles Ferentchak

คำตอบ:


156

หลังจากใช้โหนดมาหลายปีฉันสามารถพูดได้ว่าไม่มีข้อกำหนดสำหรับโครงสร้างไดเร็กทอรี / ไฟล์ อย่างไรก็ตามแอปพลิเคชันด่วน (มืออาชีพ) ส่วนใหญ่ใช้การตั้งค่าเช่น:

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

ตัวอย่างที่ใช้การตั้งค่านี้เป็นnodejs เริ่มต้น

ฉันเปลี่ยนการตั้งค่านี้เป็นการส่วนตัวเป็น:

/
  /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

อัปเดต (styleguides):


27
คำตอบของคุณน่าสนใจและทำได้ดีเพียงใดมันไม่เกี่ยวกับหัวข้อผู้สร้างหัวข้อถามโดยเฉพาะสำหรับหลักการตั้งชื่อที่ไม่ใช่โครงสร้างไดเรกทอรี เมื่อเราเข้าสู่หัวข้อนี้เราคาดว่าจะทราบว่าไฟล์ต่างๆได้รับการตั้งชื่อที่ดีกว่าด้วยขีดกลางขีดล่างหรือ camelCase หรือไม่ ฉันจะโหวตเพิ่มหากมีการเพิ่มคำตอบนี้
Tronix117

3
@ Tronix117 ปัญหาคืออะไร? คำถามถามว่า "หลักการตั้งชื่อโครงการสำหรับไฟล์และโฟลเดอร์?" และการตั้งชื่อไม่ จำกัด เฉพาะชื่อไฟล์เนื่องจากยังรวมถึงชื่อพา ธ แบบเต็มด้วย
bodokaiser

24
แน่นอน แต่ผู้เขียนถามเป็นพิเศษว่า "ฉันควรใช้ตัวพิมพ์ใหญ่ camelCase หรือ under-score?" เมื่อเขาเขียนตัวอย่างเขาใส่ 'someThings' และ 'some-things' อย่างชัดเจนเพื่อให้รู้ว่ามันถือได้ว่าถูกต้องหรือไม่ เมื่อฉันไปที่หัวข้อนี้ฉันคาดหวังว่าจะได้คำตอบสำหรับคำถามเฉพาะนี้และรู้ว่าอะไรมักจะใช้เป็นชื่อไฟล์ ฉันไม่ได้บอกว่าคำตอบของคุณผิดมันสมบูรณ์แบบสำหรับวัตถุประสงค์ แต่ไม่สมบูรณ์ในใจของฉันเพราะเขาไม่ได้ตอบคำถามหลักจริงๆ
Tronix117

5
ฉันคิดว่าคุณเข้าใจฉันผิด;) ฉันแค่มองหาบางสิ่งที่ฉันไม่พบในคำตอบที่ยอมรับ แต่ถูกถามเป็นพิเศษโดยไม่ได้แพร่กระจายความเกลียดชังใด ๆ คุณจะไปไกลกว่านี้เล็กน้อย ฉันแค่อยากให้คุณเพิ่มข้อมูลบางอย่างเกี่ยวกับคำตอบนั้นเพื่อที่คนที่จะมองหาสิ่งนั้นในอนาคตจะไม่ตกอยู่ในทางตัน
Tronix117

3
@ Tronix117 อันที่จริงนี่เป็นสาเหตุที่ทำให้ฉันพบว่าตัวเองอยู่ในหน้านี้เพื่ออ่านคำตอบนี้ ฉันหวังว่าจะไม่เพียง แต่โครงสร้างไดเร็กทอรี แต่ที่สำคัญกว่านั้นคืออนุสัญญาชื่อ (ขีดกลางขีดล่าง camelCase TitleCase ฯลฯ ... ) น่าเสียดายที่คำตอบยังไม่มีอยู่และดูเหมือนว่าฉันbodokaiserจะทำอะไรเป็นการส่วนตัวเกินไปสำหรับฉันที่จะกระโดดเข้าไปและขอให้เพิ่มความคิดเห็นของเขาเกี่ยวกับเรื่องนี้ในคำตอบของเขา (ตามที่ OP ถามในตอนแรกในคำถามของพวกเขา) ( ไอ ไอ )
หมุน

101

ใช้kebab-caseสำหรับชื่อแพ็คเกจโฟลเดอร์และไฟล์ทั้งหมด

ทำไม?

คุณควรจินตนาการว่าอาจมีการแตกโฟลเดอร์หรือไฟล์ลงในแพ็คเกจของตัวเองในบางวัน แพ็คเกจต้องไม่มีตัวอักษรตัวพิมพ์ใหญ่

แพ็กเกจใหม่ต้องไม่มีตัวอักษรพิมพ์ใหญ่ในชื่อ https://docs.npmjs.com/files/package.json#name

ดังนั้นcamelCaseไม่ควรใช้ ใบนี้snake_caseและkebab-case.

kebab-caseเป็นอนุสัญญาที่พบมากที่สุดในปัจจุบัน การใช้เครื่องหมายขีดล่างมีไว้สำหรับแพ็กเกจโหนดภายในเท่านั้นและนี่เป็นเพียงข้อตกลงจากยุคแรก ๆ


2
คุณลืมจุด? เช่น socket.io
Roee

1
.2c สามารถทำระบบอัตโนมัติง่ายๆจาก kebab-case ไปจนถึง kebabCase ในสคริปต์หรือแอพในภาษาใดก็ได้โดยใช้ regex - ทำได้ตลอดเวลา🙃
rob2d

63

ไม่มีอนุสัญญาใด ๆ มีโครงสร้างทางตรรกะบางอย่าง

สิ่งเดียวที่ฉันสามารถพูดได้: อย่าใช้ไฟล์ camelCase และชื่อไดเร็กทอรี ทำไม? ใช้งานได้ แต่บน Mac และ Windows จะไม่มีความแตกต่างระหว่าง someAction และการกระทำบางอย่าง ฉันพบปัญหานี้ไม่ใช่ครั้งเดียว ฉันต้องการไฟล์แบบนี้:

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

แต่น่าเศร้าที่ฉันสร้างไฟล์ที่เต็มไปด้วยตัวพิมพ์เล็ก: lib/ishidden.js. มันใช้ได้กับฉันบน mac มันทำงานได้ดีบน mac ของเพื่อนร่วมงานของฉัน การทดสอบดำเนินไปโดยไม่มีข้อผิดพลาด หลังจากปรับใช้แล้วเราพบข้อผิดพลาดใหญ่:

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

โอ้ใช่. มันเป็นกล่อง linux ดังนั้นโครงสร้างไดเร็กทอรี camelCase อาจเป็นอันตราย ก็เพียงพอแล้วสำหรับเพื่อนร่วมงานที่กำลังพัฒนาบน Windows หรือ Mac

ดังนั้นใช้ตัวคั่นขีดล่าง (_) หรือเส้นประ (-) หากคุณต้องการ


4
+1 เพิ่มข้อเท็จจริงที่ว่าการเปลี่ยนชื่อโฟลเดอร์ที่คำนึงถึงตัวพิมพ์เล็กและใหญ่ใน git บนระบบที่ไม่ใช่ cs เป็นเรื่องยุ่งยากอย่างแท้จริง
สูงสุด

4
ฉันไม่ค่อยเข้าใจปัญหาเกี่ยวกับ camelCase ที่นี่ ปัญหาจะไม่ได้รับการแก้ไขโดยการตั้งชื่อไฟล์อย่างถูกต้องตั้งแต่แรก (lib / isHidden.js) หรือไม่?
Mike

เฮ้ไมค์ประเด็นก็คือ camelCase กำลังจะหยุดการใช้งานในบางระบบ ฉันสับสนว่าทำไมไดเร็กทอรีของฉันถึงได้รับ 404 เมื่อฉันปรับใช้จาก Mac ไปยังกล่อง Linux ที่มีแพ็คเกจชื่อ "groupPages" ฉันต้องเปลี่ยนเป็นกลุ่มเพจเพื่อแก้ไขสิ่งต่างๆ
tempranova

3
ที่แย่กว่านั้น: สร้างชื่อไฟล์ในเวอร์ชันอูฐและให้เพื่อนร่วมงานที่ไม่ใส่ใจสร้างเวอร์ชันตัวพิมพ์เล็กในไดเรกทอรีเดียวกัน ตอนนี้ตรวจสอบในระบบปฏิบัติการที่ไม่คำนึงถึงขนาดตัวพิมพ์และพยายามหาสาเหตุว่าทำไมแอปพลิเคชันของคุณจึงไม่ทำงาน และใช่สิ่งนี้เกิดขึ้น
L0LN1NJ4

ฉันชอบคำตอบนี้ แต่ฉันต้องการชี้ให้เห็นว่าเส้นประ (-) อาจมีปัญหาเช่นกัน ตัวอย่างเช่นการใช้กรอบการทดสอบ Nighwatch ฉันสร้างอ็อบเจ็กต์เพจชื่อ admin-login.js จากนั้นฉันพยายามเข้าถึงจากสคริปต์ทดสอบโดยใช้const loginPage = browser.page.admin-login(). ReferenceError: login is not definedผมมีข้อผิดพลาด การใช้ขีดล่าง (_) สำหรับชื่อไฟล์ช่วยแก้ปัญหาได้ ฉันยังสามารถจินตนาการได้ว่าการใช้ชื่อไฟล์ที่มีอักขระเส้นประในบรรทัดคำสั่งอาจทำให้เกิดปัญหาได้ ดังนั้นฉันจะบอกว่าขีดล่างเป็นตัวคั่นที่ปลอดภัยที่สุดสำหรับชื่อไฟล์โดยทั่วไป
Dragan Nikolic

15

อ้างอิงจาก ' Google JavaScript Style Guide '

ชื่อไฟล์ต้องเป็นตัวพิมพ์เล็กทั้งหมดและอาจมีขีดล่าง (_) หรือขีดกลาง (-) แต่ไม่มีเครื่องหมายวรรคตอนเพิ่มเติม ปฏิบัติตามแบบแผนที่โครงการของคุณใช้ นามสกุลของชื่อไฟล์ต้องเป็น. js


3

คนส่วนใหญ่ใช้camelCaseใน JS หากคุณต้องการโอเพ่นซอร์สฉันขอแนะนำให้คุณใช้อันนี้ :-)


บางโปรเจ็กต์เช่น Locomotive.js ใช้camelCaseสำหรับไฟล์คอนโทรลเลอร์ :-) ขึ้นอยู่กับ ฉันมักจะใช้PascalCaseสำหรับไฟล์แบบคลาส
Mathieu Amiot

@yitsushi ดูเหมือนจะเพิ่มความกังวลกับการตั้งชื่อกรณีอูฐ (และปาสคาล) หากคุณต้องการสร้างเคสอูฐแบบพกพาดูเหมือนจะเป็นความคิดที่ไม่ดี?
gumaflux

0

Node.js ไม่บังคับใช้หลักการตั้งชื่อไฟล์ใด ๆ (ยกเว้นindex.js) และภาษา Javascript โดยทั่วไปก็ไม่มีเช่นกัน คุณสามารถค้นหาเธรดจำนวนมากได้ที่นี่ซึ่งแนะนำ camelCase ขีดกลางและขีดล่างซึ่งใด ๆ ที่ทำงานได้ดีอย่างสมบูรณ์ มันขึ้นอยู่กับคุณ เลือกหนึ่งและติดกับมัน


1
ไม่ใช่สิ่งที่โหนด 'บังคับใช้' โปรดอ่านสิ่งนี้: nodejs.org/api/modules.html#modules_folders_as_modules
moka

0

ตามฉัน: สำหรับไฟล์ให้ใช้ตัวพิมพ์เล็กอูฐถ้า module.exports เป็นวัตถุฉันหมายถึงโมดูลซิงเกิลตัน สิ่งนี้ใช้ได้กับไฟล์ JSON เช่นกันเนื่องจากเป็นแบบตันเดียว ใช้ตัวพิมพ์ใหญ่อูฐหาก module.exports ส่งกลับฟังก์ชันคอนสตรัคเตอร์ที่ทำหน้าที่เหมือนคลาส

สำหรับโฟลเดอร์ใช้ชื่อย่อ หากจำเป็นต้องมีหลายคำให้ใช้ตัวพิมพ์เล็กทั้งหมดคั่นด้วย "-" เพื่อให้สามารถใช้งานได้กับทุกแพลตฟอร์มอย่างสม่ำเสมอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.