ตกลงมันได้รับในขณะนี้และเป็นคำถามที่นิยมดังนั้นผมจึงได้ไปข้างหน้าหายไปและสร้างพื้นที่เก็บข้อมูล GitHub นั่งร้านที่มีรหัส JavaScript และ README นานเกี่ยวกับวิธีที่ผมชอบที่จะจัดโครงสร้างขนาดกลางแอพลิเคชัน express.js
focusaurus / express_code_structureเป็น repo กับรหัสล่าสุดนี้ ร้องขอดึงต้อนรับ
นี่เป็นภาพรวมของ README เนื่องจาก stackoverflow ไม่ชอบคำตอบแค่ลิงก์ ฉันจะทำการอัปเดตบางอย่างเนื่องจากเป็นโครงการใหม่ที่ฉันจะทำการอัปเดตต่อไป แต่ในที่สุด gitub repo จะเป็นสถานที่ที่ทันสมัยสำหรับข้อมูลนี้
โครงสร้างรหัสด่วน
โปรเจ็กต์นี้เป็นตัวอย่างของวิธีจัดระเบียบเว็บแอปพลิเคชัน express.js ขนาดกลาง
ปัจจุบันเป็นอย่างน้อย v4.14 ธันวาคม 2559
ใบสมัครของคุณใหญ่แค่ไหน?
แอปพลิเคชันบนเว็บนั้นไม่เหมือนกันทั้งหมดและในความคิดของฉันมีโครงสร้างรหัสเดียวที่ควรใช้กับแอปพลิเคชัน express.js ทั้งหมด
หากแอปพลิเคชันของคุณมีขนาดเล็กคุณไม่จำเป็นต้องมีโครงสร้างไดเรกทอรีแบบลึกดังตัวอย่างที่นี่ เพียงแค่ให้มันง่ายและติดกำมือของ.js
ไฟล์ในรากของพื้นที่เก็บข้อมูลของคุณและคุณทำเสร็จแล้ว voila
หากใบสมัครของคุณมีขนาดใหญ่ในบางจุดคุณจำเป็นต้องแยกมันออกเป็นแพ็กเกจ npm ที่แตกต่างกัน โดยทั่วไปแล้ววิธีการ node.js ดูเหมือนจะให้ความสำคัญกับแพ็กเกจขนาดเล็กจำนวนมากอย่างน้อยก็สำหรับไลบรารี่และคุณควรสร้างแอพพลิเคชั่นของคุณโดยใช้แพ็กเกจ npm หลายอันซึ่งเริ่มมีเหตุผลและสมเหตุสมผล ดังนั้นเมื่อแอปพลิเคชันของคุณโตขึ้นและบางส่วนของรหัสจะสามารถนำกลับมาใช้ใหม่ได้อย่างชัดเจนนอกแอปพลิเคชันของคุณหรือเป็นระบบย่อยที่ชัดเจนให้ย้ายไปยังที่เก็บ git ของตัวเองและทำให้มันเป็นแพคเกจ
ดังนั้นจุดเน้นของโครงการนี้คือการแสดงโครงสร้างที่ใช้การได้สำหรับแอปพลิเคชันขนาดกลาง
สถาปัตยกรรมโดยรวมของคุณคืออะไร
มีหลายวิธีในการสร้างเว็บแอปพลิเคชันเช่น
- ฝั่งเซิร์ฟเวอร์ MVC และ Ruby บน Rails
- แอปพลิเคชันหน้าเดียวสไตล์ a la MongoDB / Express / Angular / Node (MEAN)
- เว็บไซต์พื้นฐานที่มีบางรูปแบบ
- สไตล์รุ่น / การดำเนินงาน / อ่าน / กิจกรรมลาMVC ตายมันถึงเวลาที่จะไป
- และอื่น ๆ อีกมากมายทั้งในปัจจุบันและในอดีต
แต่ละสิ่งเหล่านี้เหมาะสมอย่างยิ่งในโครงสร้างไดเรกทอรีที่แตกต่างกัน สำหรับวัตถุประสงค์ของตัวอย่างนี้เป็นเพียงนั่งร้านและไม่ได้เป็น app ทำงานอย่างเต็มที่ แต่ฉันสมมติว่าจุดสถาปัตยกรรมที่สำคัญดังต่อไปนี้:
- ไซต์มีหน้า / แม่แบบดั้งเดิมบางส่วน
- "การประยุกต์ใช้" ส่วนหนึ่งของเว็บไซต์ที่มีการพัฒนาเป็นรูปแบบหน้าเดียวแอพลิเคชัน
- แอปพลิเคชั่นเปิดเผย REST / JSON style API ไปยังเบราว์เซอร์
- รุ่นแอปโดเมนธุรกิจง่ายในกรณีนี้มันเป็นโปรแกรมตัวแทนจำหน่ายรถยนต์
และสิ่งที่เกี่ยว Ruby on Rails?
มันจะเป็นธีมของโครงการนี้ที่ความคิดหลายอย่างรวมอยู่ใน Ruby on Rails และการตัดสินใจ "อนุสัญญาการตั้งค่าคอนฟิก" ที่พวกเขานำมาใช้แม้ว่าจะได้รับการยอมรับและใช้กันอย่างแพร่หลาย แต่ก็ไม่ค่อยมีประโยชน์จริง ๆ แนะนำ
จุดหลักของที่นี่คือที่มีหลักการพื้นฐานในการจัดระเบียบรหัสและบนพื้นฐานของหลักการเหล่านั้น Ruby on Rails ประชุมให้ความรู้สึก (ส่วนใหญ่) สำหรับ Ruby on Rails ชุมชน อย่างไรก็ตามเพียงแค่คิดถึงการประชุมที่คิดถึงจุดนั้น เมื่อคุณค้นหาหลักการพื้นฐานโครงการของคุณทั้งหมดจะได้รับการจัดระเบียบและชัดเจน: เชลล์สคริปต์เกมแอพมือถือโครงการขององค์กรหรือแม้แต่โฮมไดเร็กตอรี่ของคุณ
สำหรับชุมชน Rails พวกเขาต้องการให้ผู้พัฒนา Rails สลับจากแอพหนึ่งเป็นแอพเป็นแอพและคุ้นเคยกับมันในแต่ละครั้ง นี่เป็นเหตุผลที่ดีถ้าคุณเป็น 37 สัญญาณหรือ Pivotal Labs และมีประโยชน์ ในโลกฝั่งเซิร์ฟเวอร์ JavaScript ที่ร๊อคโดยรวมเป็นเพียงสิ่งที่ตะวันตกทางป่ามากขึ้นไปและเราไม่ได้จริงๆมีปัญหากับที่ นั่นคือวิธีการที่เราม้วน. เราคุ้นเคยกับมัน แม้แต่ภายใน express.js มันเป็นญาติสนิทของ Sinatra ไม่ใช่ Rails และการประชุมจาก Rails มักไม่ช่วยอะไรเลย ผมก็จะบอกว่าหลักการมากกว่าการประชุมมากกว่าการกำหนดค่า
หลักการและแรงจูงใจพื้นฐาน
เคล็ดลับของแอป symlink
มีหลายวิธีที่ระบุไว้และพูดคุยกันที่ความยาวโดยชุมชนในกระทู้ที่ดีท้องถิ่น Better ต้องการ () เส้นทางสำหรับ Node.js ฉันอาจตัดสินใจที่จะชอบ "แค่จัดการกับ .. /../../ .. " จำนวนมากหรือใช้requireFrom modlue อย่างไรก็ตามในขณะนี้ฉันใช้เคล็ดลับ symlink โดยละเอียดด้านล่าง
ดังนั้นวิธีหนึ่งที่จะหลีกเลี่ยงการภายในโครงการต้องมีเส้นทางญาติที่น่ารำคาญเหมือนrequire("../../../config")
คือการใช้เคล็ดลับต่อไปนี้:
- สร้าง symlink ภายใต้ node_modules สำหรับแอปของคุณ
- cd node_modules && ln -nsf ../app
- เพิ่มเพียง node_modules / app symlink เองไม่ใช่โฟลเดอร์ node_modules ทั้งหมดเพื่อคอมไพล์
- git add -f node_modules / app
- ใช่คุณควรมี "node_modules" ใน
.gitignore
ไฟล์ของคุณ
- ไม่คุณไม่ควรใส่ "node_modules" ในที่เก็บ git ของคุณ บางคนจะแนะนำให้คุณทำเช่นนี้ พวกเขาไม่ถูกต้อง
- ตอนนี้คุณสามารถต้องการโมดูลภายในโครงการโดยใช้คำนำหน้านี้
var config = require("app/config");
var DealModel = require("app/deals/deal-model")
;
- โดยทั่วไปนี้ทำให้ภายในโครงการต้องทำงานมากคล้าย ๆ กับต้องสำหรับโมดูล NPM ภายนอก
- ขออภัยผู้ใช้ Windows คุณต้องติดกับพาเรนต์ของไดเรกทอรีหลัก
องค์ประกอบ
โดยทั่วไปโมดูลรหัสและการเรียนที่คาดหวังเพียง JavaScript พื้นฐานoptions
วัตถุผ่านใน. เท่านั้นapp/server.js
ควรโหลดapp/config.js
โมดูล จากนั้นสามารถสังเคราะห์options
วัตถุขนาดเล็กเพื่อกำหนดค่าระบบย่อยได้ตามต้องการ แต่การเชื่อมระบบย่อยทุกระบบเข้ากับโมดูลการกำหนดค่าระดับโลกขนาดใหญ่ที่เต็มไปด้วยข้อมูลเพิ่มเติมคือการเชื่อมต่อที่ไม่ดี
พยายามรวบรวมการสร้างการเชื่อมต่อฐานข้อมูลและส่งสิ่งเหล่านั้นไปยังระบบย่อยซึ่งตรงข้ามกับการส่งผ่านพารามิเตอร์การเชื่อมต่อและการให้ระบบย่อยทำการเชื่อมต่อขาออกด้วยตนเอง
NODE_ENV
นี่เป็นอีกหนึ่งความคิดที่น่าหลงใหล แต่น่ากลัวที่นำมาจาก Rails ควรมีที่เดียวในแอปของคุณapp/config.js
ซึ่งจะดูที่NODE_ENV
ตัวแปรสภาพแวดล้อม ทุกอย่างอื่นควรใช้ตัวเลือกที่ชัดเจนเป็นอาร์กิวเมนต์ตัวสร้างคลาสหรือพารามิเตอร์การกำหนดค่าโมดูล
ถ้าโมดูลอีเมลมีตัวเลือกเป็นวิธีการส่งอีเมล (ไม่ SMTP, เข้าสู่ระบบที่ stdout ใส่ในคิว ฯลฯ ) จึงควรใช้ตัวเลือกเหมือนแต่ควรอย่างยิ่งที่ได้ตรวจสอบ{deliver: 'stdout'}
NODE_ENV
การทดสอบ
ตอนนี้ฉันเก็บไฟล์ทดสอบของฉันไว้ในไดเรกทอรีเดียวกับรหัสที่เกี่ยวข้องและใช้ข้อตกลงการตั้งชื่อนามสกุลไฟล์เพื่อแยกความแตกต่างการทดสอบจากรหัสการผลิต
foo.js
มีรหัสของโมดูล "foo"
foo.tape.js
มีการทดสอบตามโหนดสำหรับ foo และอาศัยอยู่ใน dir เดียวกัน
foo.btape.js
สามารถใช้สำหรับการทดสอบที่ต้องดำเนินการในสภาพแวดล้อมของเบราว์เซอร์
ฉันใช้ระบบไฟล์ globs และfind . -name '*.tape.js'
คำสั่งเพื่อเข้าถึงการทดสอบทั้งหมดของฉันตามความจำเป็น
วิธีจัดระเบียบรหัสภายในแต่ละ.js
ไฟล์โมดูล
ขอบเขตของโครงการนี้ส่วนใหญ่จะเกี่ยวกับที่ที่ไฟล์และไดเรกทอรีไปและฉันไม่ต้องการเพิ่มขอบเขตอื่น ๆ อีกมากมาย แต่ฉันจะพูดถึงว่าฉันจัดระเบียบรหัสของฉันเป็น 3 ส่วนที่แตกต่างกัน
- การเปิดบล็อกของ CommonJS ต้องมีการเรียกไปยังสถานะการพึ่งพา
- รหัสบล็อกหลักของ pure-JavaScript ไม่มีมลพิษของ CommonJS ในที่นี้ อย่าอ้างอิงการส่งออกโมดูลหรือจำเป็นต้องใช้
- การปิดบล็อกของ CommonJS เพื่อตั้งค่าการส่งออก