Angular 2 ควรใช้โครงสร้างโฟลเดอร์ประเภทใด


130

ฉันเป็นนักพัฒนา Angular 1 ที่กำลังเริ่มเรียนรู้เกี่ยวกับ Angular 2 มีวิธีการจัดโครงสร้างโฟลเดอร์ประเภทต่างๆมากมายขึ้นอยู่กับเอกสารการฝึกอบรม ฉันจะแสดงรายการแต่ละรายการด้านล่างและฉันชอบที่จะได้รับความคิดเห็นของผู้คนว่าฉันควรใช้อะไรและทำไม นอกจากนี้หากมีวิธีการที่ไม่อยู่ในรายการ แต่คุณรู้สึกว่าได้ผลดีขึ้นโปรดอย่าลังเลที่จะระบุไว้ด้วย

จากการดูสิ่งเหล่านี้ทั้งหมดวิธีที่ # 3 เป็นวิธีที่ฉันใช้แอพ Angular 1

วิธีที่ 1: angular2-quickstart

ที่มา: https://angular.io/guide/quickstart

โครงสร้างโฟลเดอร์:

ป้อนคำอธิบายภาพที่นี่

วิธีที่ 2: ng-book2

ที่มา: https://www.ng-book.com/2/ (ต้องเสียเงินเพื่อดูไฟล์)

โครงสร้างโฟลเดอร์:

ป้อนคำอธิบายภาพที่นี่

วิธีที่ 3: mgechev / angular2-seed

ที่มา: https://github.com/mgechev/angular2-seed

โครงสร้างโฟลเดอร์:

ป้อนคำอธิบายภาพที่นี่


1
ฉันรู้สึกว่าวิธีที่ 2 มีประสิทธิภาพที่สุดเนื่องจากควรเก็บส่วนประกอบบริการและอื่น ๆ ทั้งหมดไว้ในโฟลเดอร์แยกต่างหากเพื่อให้ค้นหาไฟล์ได้ง่ายในภายหลัง นี่เป็นวิธีที่มีประสิทธิภาพที่สุดในแอปที่ซับซ้อนมาก
Bryan

ขอบคุณสำหรับคำตอบ @Bryan คุณคิดว่าสาเหตุของโฟลเดอร์การพิมพ์คืออะไร ไม่มีอีก 2 วิธีที่ใช้ คุณมีความเห็นเกี่ยวกับ app.ts vs main.ts สำหรับไฟล์หลักหรือไม่?
Marin Petkov

ดังนั้นเมล็ดพันธุ์ที่ฉันใช้เมื่อเร็ว ๆ นี้จึงไปที่คู่มือสไตล์ซึ่งเป็นวิธีที่ 3 ที่นี่ ฉันสับสนว่าเครื่องชั่งนี้เป็นอย่างไรและทำไมจึงมีโฟลเดอร์ที่ใช้ร่วมกัน ไม่ใช่ประเด็นทั้งหมดของกรอบงานนี้เพื่อให้ทุกคนสามารถแชร์ส่วนประกอบ / คำสั่ง / ท่อ / บริการได้ใช่หรือไม่ เป็นเรื่องยากสำหรับฉันที่จะเข้าใจวิธีค้นหาคำสั่ง / ท่อได้อย่างง่ายดาย .. ด้วยรูปแบบคำแนะนำสไตล์ที่คุณต้องรู้ว่ามันอยู่ที่ไหนหรือดูในทุกโฟลเดอร์สำหรับบริการที่คุณคิดว่าคุณจะใช้สำหรับลูกค้าเท่านั้นและตอนนี้คุณ ต้องการสิ่งอื่น ๆ
Gary

1
@Gary - ดังนั้นสิ่งที่ฉันใช้ในโฟลเดอร์ที่ใช้ร่วมกันสำหรับ seeder คือทุกสิ่งที่แชร์สามารถใช้ในคลาสที่อยู่ในระดับโฟลเดอร์เดียวกันหรือโฟลเดอร์ย่อยใด ๆ คุณสามารถใช้คลาสใดก็ได้หรือไม่? แน่นอนว่าคุณทำได้ แต่เมื่อมีคนใหม่ดูรหัสของคุณพวกเขาจะไม่รู้ว่าเกิดอะไรขึ้น การวางคลาสที่ใช้ระหว่างส่วนประกอบ / โฟลเดอร์ต่างๆภายในที่ใช้ร่วมกันอย่างชัดเจนจะช่วยให้โปรแกรมเมอร์ทราบว่ามีการใช้งานในหลายที่
Marin Petkov

1
ทีมของเราเพิ่งผ่านขั้นตอนการตัดสินใจนี้และพบว่าแหล่งข้อมูลนี้มีประโยชน์มาก: npmjs.com/package/awesome-angular2
theUtherSide

คำตอบ:


117

ขณะนี้มีแนวทางอย่างเป็นทางการแล้ว mgechev/angular2-seedมีแนวเดียวกันด้วย ดู# 857

โครงสร้างแอปพลิเคชัน Angular 2

https://angular.io/guide/styleguide#overall-structural-guidelines


3
ฉันไม่พบว่าเอกสารแนะนำให้ใส่เครื่องหมาย "+" ไว้ที่ใดก่อนชื่อโฟลเดอร์ จำไม่ได้ว่าหมายถึงอะไรมีคำอธิบายไหม
FacundoGFlores

แต่ละindex.tsไฟล์มีจุดประสงค์อะไร มีไว้สำหรับการกำหนดเส้นทางหรือไม่?
Nicky

1
@FacundoGFlores หมายความว่ามีการโหลดส่วนประกอบที่ขี้เกียจ
charlie_pl

2
@Nicky Purpose สำหรับไฟล์ index.ts คือการทำให้การนำเข้าง่ายขึ้นคุณไม่จำเป็นต้องนำเข้าจากแต่ละไฟล์ แต่จากโฟลเดอร์: ตัวอย่างเช่นนำเข้า {Hero, Sword, Shield} จาก "app / heroes / hero"
charlie_pl

1
รูปภาพด้านบนนี้ล้าสมัยแล้ว ตัวอย่างเช่นจะไม่แสดงโฟลเดอร์ "src" ซึ่งกลายเป็นโฟลเดอร์หลักของโฟลเดอร์ "app"
Christoph

12

ฉันคิดว่าการจัดโครงสร้างโครงการตามฟังก์ชันการทำงานเป็นวิธีการที่ใช้ได้จริง ทำให้โครงการปรับขนาดและบำรุงรักษาได้ง่าย และทำให้แต่ละส่วนของโปรเจ็กต์ทำงานเป็นอิสระทั้งหมด แจ้งให้เราทราบว่าคุณคิดอย่างไรเกี่ยวกับโครงสร้างนี้ด้านล่าง: โครงสร้างโครงการประเภทเชิงมุม - ANGULAR 2

แหล่งที่มา: http://www.angulartypescript.com/angular-typescript-project-structure/


11

ฉันจะใช้อันนี้ คล้ายกับอันที่สามที่แสดงโดย @Marin

app
|
|___ images
|
|___ fonts
|
|___ css
|
|___ *main.ts*
|   
|___ *main.component.ts*
|
|___ *index.html*
|
|___ components
|   |
|   |___ shared
|   |
|   |___ home
|   |
|   |___ about
|   |
|   |___ product
|
|___ services
|
|___ structures

2
คำตอบนี้เก่าแล้ว mgechev/angular2-seedตอนนี้ฉันใช้จาก github สำหรับ 3 โครงการของฉัน สุดยอดมาก !!!
Savaratkar

คำตอบของ Savaratkar ดีที่สุดที่นี่อย่างไรก็ตามฉันจะไปไกลกว่านั้นโดยการสร้างสินทรัพย์สำหรับผู้สูงอายุที่มี js, css, รูปภาพ, ฟอนต์ ... ฯลฯ อยู่
vicgoyso

10

ดังนั้นหลังจากทำการตรวจสอบเพิ่มเติมแล้วฉันก็ลงเอยด้วยวิธีที่ 3 ที่แก้ไขเล็กน้อย (mgechev / angular2-seed)

โดยพื้นฐานแล้วฉันได้ย้ายส่วนประกอบต่างๆไปเป็นไดเร็กทอรีระดับหลักจากนั้นแต่ละฟีเจอร์จะอยู่ในนั้น


2

อาจจะเป็นโครงสร้างนี้:

|-- app
     |-- modules
       |-- home
           |-- [+] components
           |-- pages
              |-- home
              |-- home.component.ts|html|scss|spec
           |-- home-routing.module.ts
           |-- home.module.ts
     |-- core
       |-- authentication
           |-- authentication.service.ts|spec.ts
       |-- footer
           |-- footer.component.ts|html|scss|spec.ts
       |-- guards
           |-- auth.guard.ts
           |-- no-auth-guard.ts
           |-- admin-guard.ts 
       |-- http
           |-- user
               |-- user.service.ts|spec.ts
           |-- api.service.ts|spec.ts
       |-- interceptors
           |-- api-prefix.interceptor.ts
           |-- error-handler.interceptor.ts
           |-- http.token.interceptor.ts
       |-- mocks
           |-- user.mock.ts
       |-- services
           |-- srv1.service.ts|spec.ts
           |-- srv2.service.ts|spec.ts
       |-- header
           |-- header.component.ts|html|scss|spec.ts
       |-- core.module.ts
       |-- ensureModuleLoadedOnceGuard.ts
       |-- logger.service.ts
     |-- shared
          |-- components
              |-- loader
                  |-- loader.component.ts|html|scss|spec.ts
          |-- buttons
              |-- favorite-button
                  |-- favorite-button.component.ts|html|scss|spec.ts
              |-- collapse-button
                  |-- collapse-button.component.ts|html|scss|spec.ts
          |-- directives
              |-- auth.directive.ts|spec.ts
          |-- pipes
              |-- capitalize.pipe.ts
              |-- safe.pipe.ts
     |-- configs
         |-- app-settings.config.ts
         |-- dt-norwegian.config.ts
     |-- scss
          |-- [+] partials
          |-- _base.scss
          |-- styles.scss
     |-- assets

0

ฉันใช้ ng cli เมื่อเร็ว ๆ นี้และมันยากมากที่จะหาวิธีที่ดีในการจัดโครงสร้างโค้ดของฉัน

สิ่งที่มีประสิทธิภาพที่สุดที่ฉันเคยเห็นมาจากที่เก็บ mrholek ( https://github.com/mrholek/CoreUI-Angular )

โครงสร้างโฟลเดอร์นี้ช่วยให้คุณสามารถรักษาโปรเจ็กต์รูทของคุณให้สะอาดและจัดโครงสร้างส่วนประกอบของคุณได้โดยหลีกเลี่ยงรูปแบบการตั้งชื่อที่ซ้ำซ้อน (บางครั้งก็ไร้ประโยชน์) ของ Style Guide อย่างเป็นทางการ

นอกจากนี้โครงสร้างนี้ยังมีประโยชน์ในการนำเข้ากลุ่มเมื่อจำเป็นและหลีกเลี่ยงการนำเข้า 30 บรรทัดสำหรับไฟล์เดียว

src
|
|___ app
|
|   |___ components/shared
|   |   |___ header
|   |
|   |___ containers/layout
|   |   |___ layout1
|   |
|   |___ directives
|   |   |___ sidebar
|   |
|   |___ services
|   |   |___ *user.service.ts* 
|   | 
|   |___ guards
|   |   |___ *auth.guard.ts* 
|   |
|   |___ views
|   |   |___ about  
|   |
|   |___ *app.component.ts*
|   |
|   |___ *app.module.ts*
|   |
|   |___ *app.routing.ts*
|
|___ assets
|
|___ environments
|
|___ img
|   
|___ scss
|
|___ *index.html*
|
|___ *main.ts*

0

หากโครงการมีขนาดเล็กและยังคงมีขนาดเล็กฉันขอแนะนำให้จัดโครงสร้างตามประเภท (วิธีที่ 2: ng-book2)

app
|- components
|  |- hero
|  |- hero-list
|  |- villain
|  |- ...
|- services
|  |- hero.service.ts
|  |- ...
|- utils
|- shared

หากโครงการจะเติบโตคุณควรจัดโครงสร้างโฟลเดอร์ของคุณตามโดเมน (วิธีที่ 3: mgechev / angular2-seed)

app
|- heroes
|  |- hero
|  |- hero-list
|  |- hero.service.ts
|- villains
|  |- villain
|  |- ...
|- utils
|- shared

ติดตามเอกสารอย่างเป็นทางการได้ดีกว่า
https://angular.io/guide/styleguide#application-structure-and-ngmodules


0

ฉันขอแนะนำโครงสร้างต่อไปนี้ซึ่งอาจละเมิดอนุสัญญาบางประการที่มีอยู่

ฉันพยายามลดความซ้ำซ้อนของชื่อในเส้นทางและพยายามตั้งชื่อให้สั้นโดยทั่วไป

ดังนั้นจึงไม่มี / app / components / home / home.component.ts | html | css

แต่ดูเหมือนว่า:

|-- app
    |-- users
        |-- list.ts|html|css
        |-- form.ts|html|css
    |-- cars
        |-- list.ts|html|css
        |-- form.ts|html|css
        |-- configurator.ts|html|css
    |-- app.component.ts|html|css
    |-- app.module.ts
    |-- user.service.ts
    |-- car.service.ts
|-- index.html
|-- main.ts
|-- style.css
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.