แนวปฏิบัติที่ดีที่สุดสำหรับการจัดทำแอพ Meteor ขนาดใหญ่ที่มีไฟล์เทมเพลต HTML เป็นอย่างไร [ปิด]


165

ในตัวอย่างทั้งหมด (ลีดเดอร์บอร์ด, การเล่นคำ ฯลฯ ) พวกเขามีไฟล์เทมเพลต HTML ไฟล์เดียว มีโครงการโอเพนซอร์ส Meteor ขนาดใหญ่ที่มีไฟล์เท็มเพลต HTML ต่าง ๆ มากมายที่เราสามารถใช้เป็นตัวอย่างที่ดีที่สุดได้หรือไม่? ดูเหมือนจะไม่มีประโยชน์ที่จะวางทุกสิ่งที่แอพขนาดใหญ่ต้องการทั้งหมดในไฟล์เทมเพลตเดียว


ดาวตกเป็นสิ่งใหม่ฉันยังไม่พบสิ่งใดที่เกี่ยวข้องกับแนวปฏิบัติที่ดีที่สุดเกี่ยวกับเรื่องนี้ฉันยังคาดหวังว่าจะมีกิลด์ไลน์เกี่ยวกับเรื่องนี้
newlife

10
คุณอ่านส่วนเกี่ยวกับการจัดโครงสร้างแอปพลิเคชันของคุณในคู่มือแล้วหรือยัง? มีคำอธิบายเกี่ยวกับการสแกนและการเชื่อมไฟล์ HTML
zwippie

1
คู่มืออย่างเป็นทางการของ Meteor แนะนำโครงสร้างไฟล์ที่ยอดเยี่ยมมาก ตรวจสอบที่นี่: guide.meteor.com/structure.html#javascript-structure
Waqas

คำตอบ:


16

รวมเข้าด้วยกัน! จากเอกสาร:

> HTML files in a Meteor application are treated quite a bit differently
> from a server-side framework. Meteor scans all the HTML files in your
> directory for three top-level elements: <head>, <body>, and
> <template>. The head and body sections are seperately concatenated
> into a single head and body, which are transmitted to the client on
> initial page load.
> 
> Template sections, on the other hand, are converted into JavaScript
> functions, available under the Template namespace. It's a really
> convenient way to ship HTML templates to the client. See the templates
> section for more.

29
นี่คือความกังวลของผู้โพสต์ การวางสิ่งของไม่เป็นไร แต่คุณสามารถเห็นสิ่งที่เกิดขึ้นกับอาสนะ - มันต้องใช้หน้าจอโหลดขณะที่ดาวน์โหลด> รหัสลูกค้า 1MB ไม่เป็นที่ยอมรับสำหรับเว็บไซต์จำนวนมาก เราจะดูว่าเราไม่สามารถทำชิ้นส่วนการโหลดบางส่วนหลังจากโหลดหน้าจอหลักหรือไม่ แต่ตอนนี้ฉันยังสงสัยอยู่ ฉันคิดว่ามันจะต้องมีคุณสมบัติในการแยกสิ่งต่าง ๆ ออกมาเล็กน้อย
Dave Sanders

36
คำตอบนี้เป็นผลอันดับ # 1 ใน google แต่มันล้าสมัยอย่างน่าเชื่อถือ อื่น ๆ ผู้เยี่ยมชมในอนาคตเช่นฉัน; ดูด้านล่าง!
Kloar

ตั้งแต่วันที่ 1.1.0.2 แอพพลิเคชั่น todo อย่างง่ายที่พวกเขาสาธิตจะถ่ายโอนไฟล์ 1.7MB เมื่อคุณรีโหลดฮาร์ดเบราว์เซอร์โดยลบแคช นี่เป็นเรื่องที่ยอมรับไม่ได้สำหรับกรณีการใช้งานจำนวนมาก : / สิ่งต่าง ๆ ดีขึ้นมากเมื่อสินทรัพย์ถูกแคช แต่ในการโหลดครั้งแรกมันค่อนข้างโหดร้าย
Jason Kim

แนวคิด: ใช้ webpack สร้างการรวมกลุ่มสำหรับสิ่งของขี้เกียจโหลดเมื่อจำเป็น
trusktr

ใช่อาสนะใช้เวลาโหลด อาสนะยังเป็นแอพรีแอคทีฟที่ตอบสนองได้ดีเยี่ยมอย่างไม่น่าเชื่อซึ่งผู้ใช้สร้างงานได้ถึง 175 ล้านงานในปี 2014 แอพที่โหลดเร็วขึ้นไม่ได้ดีกว่าเสมอไป แอปจะใช้เวลาสักครู่ในการเริ่มต้นใช้งานโทรศัพท์ของคุณ ผู้คนจะชินกับมัน
Max Hodges

274

ในอุกกาบาตคำถามที่พบบ่อยอย่างไม่เป็นทางการฉันคิดว่ามันค่อนข้างอธิบายวิธีการจัดโครงสร้างแอปขนาดใหญ่:

ฉันควรใส่ไฟล์ไว้ที่ไหน

แอพตัวอย่างในดาวตกนั้นง่ายมากและไม่ได้ให้ข้อมูลเชิงลึกมากนัก นี่คือความคิดปัจจุบันของฉันเกี่ยวกับวิธีที่ดีที่สุดที่จะทำ: (ข้อเสนอแนะ / การปรับปรุงยินดีมาก!)

lib/                       # <- any common code for client/server.
lib/environment.js         # <- general configuration
lib/methods.js             # <- Meteor.method definitions
lib/external               # <- common code from someone else
## Note that js files in lib folders are loaded before other js files.

collections/               # <- definitions of collections and methods on them (could be models/)

client/lib                 # <- client specific libraries (also loaded first)
client/lib/environment.js  # <- configuration of any client side packages
client/lib/helpers         # <- any helpers (handlebars or otherwise) that are used often in view files

client/application.js      # <- subscriptions, basic Meteor.startup code.
client/index.html          # <- toplevel html
client/index.js            # <- and its JS
client/views/<page>.html   # <- the templates specific to a single page
client/views/<page>.js     # <- and the JS to hook it up
client/views/<type>/       # <- if you find you have a lot of views of the same object type
client/stylesheets/        # <- css / styl / less files

server/publications.js     # <- Meteor.publish definitions
server/lib/environment.js  # <- configuration of server side packages

public/                    # <- static files, such as images, that are served directly.

tests/                     # <- unit test files (won't be loaded on client or server)

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

feature-foo/               # <- all functionality related to feature 'foo'
feature-foo/lib/           # <- common code
feature-foo/models/        # <- model definitions
feature-foo/client/        # <- files only sent to the client
feature-foo/server/        # <- files only available on the server

ค้นหาเพิ่มเติมได้ที่: คำถามที่พบบ่อยเกี่ยวกับดาวตกอย่างไม่เป็นทางการ


12
IMHO นี้ดีกว่าคำตอบที่ยอมรับ ฉันจะลองตอนนี้
hakan

17
ตั้งแต่ 0.6.0 คุณจะดีกว่าที่จะหลีกเลี่ยงความยุ่งเหยิงนั้นและเรียกใช้แอปของคุณโดยสิ้นเชิงจากแพ็คเกจอัจฉริยะ ฉันเข้าไปดูรายละเอียดเพิ่มเติมเล็กน้อยในโพสต์บล็อกนี้: matb33.me/2013/09/05/meteor-project-structure.html
matb33

1
ใครมีเบาะแสที่จะวางmobile-config.jsหรือไม่
Dude

1
ขอบคุณสำหรับคำตอบและลิงค์ไปยังทางการ - คำถามที่พบบ่อย (ฉันใหม่ในโลกของอุกกาบาต) พวกเขาหมายถึงอะไรโดย "รหัสทั่วไปจากคนอื่น" ขอบคุณ!
Cohars

3
สำหรับอุกกาบาต 1.3 ฉันว่ามันล้าสมัยแล้วเนื่องจากมีการนำเข้าโมดูล ES6 ดูบทความแนะนำดาวตกเกี่ยวกับโครงสร้างแอปพลิเคชัน: guide.meteor.com/structure.html
ซามูเอล

36

ฉันเห็นด้วยกับ yagooar แต่แทนที่จะ:

ลูกค้า / application.js

ใช้:

ลูกค้า / main.js

main. * ไฟล์ถูกโหลดครั้งสุดท้าย สิ่งนี้จะช่วยให้แน่ใจว่าคุณไม่มีปัญหาในการโหลด ดูเอกสารของ Meteor ที่http://docs.meteor.com/#structuringyourappสำหรับรายละเอียดเพิ่มเติม


26

Meteor ได้รับการออกแบบเพื่อให้คุณจัดโครงสร้างแอปของคุณในแบบที่คุณต้องการ ดังนั้นหากคุณไม่ชอบโครงสร้างของคุณคุณสามารถย้ายไฟล์ไปยังไดเรกทอรีใหม่หรือแม้แต่แยกไฟล์หนึ่งไฟล์เป็นหลาย ๆ ชิ้นและ Meteor ก็เหมือนกันหมด ทราบเพียงการรักษาพิเศษของลูกค้าเซิร์ฟเวอร์และไดเรกทอรีสาธารณะตามที่ระบุไว้ในหน้าเอกสารหลัก: http://docs.meteor.com/

เพียงแค่รวมทุกอย่างเข้าด้วยกันในการเติม HTML เดียวจะไม่ปรากฏเป็นแนวทางปฏิบัติที่ดีที่สุด

นี่คือตัวอย่างของโครงสร้างที่เป็นไปได้: ในหนึ่งในแอพของฉัน, ฟอรัมการสนทนา, ฉันจัดระเบียบโดยโมดูลหรือ "ประเภทหน้าเว็บ" (โฮม, ฟอรัม, หัวข้อ, ความคิดเห็น), การวางไฟล์. css, .html และ. js พิมพ์หน้าร่วมกันในไดเรกทอรีเดียว ฉันยังมีโมดูล "ฐาน" ซึ่งมีรหัส. css และ. js ร่วมกันและแม่แบบต้นแบบซึ่งใช้ {{renderPage}} เพื่อแสดงผลหนึ่งในโมดูลอื่น ๆ ขึ้นอยู่กับเราเตอร์

my_app/
    lib/
        router.js
    client/
        base/
            base.html
            base.js
            base.css
        home/
            home.html
            home.js
            home.css
        forum/
            forum.html
            forum.js
            forum.css
        topic/
            topic.html
            topic.js
            topic.css
        comment/
            comment.html
            comment.js
            comment.css

คุณยังสามารถจัดระเบียบตามฟังก์ชั่น

my_app/
    lib/
        router.js
    templates/
        base.html
        home.html
        forum.html
        topic.html
        comment.html
    js/
        base.js
        home.js
        forum.js
        topic.js
        comment.js
    css/
        base.css
        home.css
        forum.css
        topic.css
        comment.css

ฉันหวังว่าโครงสร้างการปฏิบัติที่ดีที่สุดที่เฉพาะเจาะจงมากขึ้นและอนุสัญญาการตั้งชื่อจะปรากฏขึ้น


2
นี่คือคำตอบที่ฉันโปรดปราน หนึ่งในสิ่งที่ฉันชอบเกี่ยวกับ Meteor ก็คือคุณสามารถจัดโครงสร้างไฟล์ในแบบที่เหมาะกับคุณ
CaptSaltyJack

ฉันชอบคำตอบนี้ ฉันได้ทำมันเป็นวิธีแรก
Sung Cho

สิ่งที่เกี่ยวข้องควรอยู่ใกล้กัน คำตอบของฉันเหมือนคุณ แต่ย้อนหลัง
Max Hodges

1.3 zapped lib เพื่อนำเข้าguide.meteor.com/structure.html#example-app-structure
Jeremy Iglehart

ฉันไม่เห็นคุณค่าในการตั้งชื่อไฟล์หลาย ๆ ไฟล์ที่มีชื่อคุณสมบัติเช่น "หัวข้อ" ตอนนี้ถ้าคุณต้องการเปลี่ยนชื่อคุณสมบัติเป็น "หมวดหมู่" คุณต้องเปลี่ยนชื่อไฟล์หลายรายการ เพียงแค่จัดระเบียบพวกเขาภายใต้โฟลเดอร์เดียวที่เรียกว่า "หัวข้อ" และตั้งชื่อโดยทั่วไป: events.js, views.html, สไตล์, css, route.js ฯลฯ ดูคำตอบของฉันมากขึ้น
Max Hodges

14

สำหรับทุกคนที่ Googling ในหัวข้อนี้:

emเครื่องมือบรรทัดคำสั่ง (โดย EventedMind คนที่อยู่เบื้องหลัง Router เหล็ก) จะมีประโยชน์มากเมื่อเสื้อผ้าดาวตก App ใหม่ มันจะสร้างโครงสร้างไฟล์ / โฟลเดอร์ที่ดี หากคุณทำงานในแอพแล้วและต้องการจัดระเบียบใหม่เพียงแค่ตั้งค่าโครงการใหม่ด้วยemและคุณสามารถใช้มันเพื่อเป็นแรงบันดาลใจ

ดู: https://github.com/EventedMind/em

และที่นี่: /programming/17509551/what-is-the-the-best-way-to-organize-templates-in-meteor-js


4
หมายเหตุ: สิ่งนี้ถูกแทนที่ด้วย iron-cli (ผู้เขียนคนเดียวกัน) ดู: github.com/iron-meteor/iron-cli
j0e

ใช่ 'em' ถูกเปลี่ยนชื่อเป็น iron-cli ซึ่งเป็นเครื่องมือเดียวกัน
Mikael Lirbank

11

ฉันคิดว่าโครงสร้างไฟล์จาก Discover Meteor Book ดีมากและเป็นการเริ่มต้นที่ดี

/app: 
 /client
   main.html
   main.js
 /server 
 /public
 /lib
 /collections
  • รหัสในไดเรกทอรี / เซิร์ฟเวอร์ทำงานบนเซิร์ฟเวอร์เท่านั้น
  • โค้ดในไดเร็กทอรี / client รันบนไคลเอ็นต์เท่านั้น
  • ทุกอย่างทำงานได้ทั้งบนไคลเอนต์และเซิร์ฟเวอร์
  • ไฟล์ใน / lib จะถูกโหลดก่อนสิ่งอื่นใด
  • ไฟล์ main * ใด ๆ จะถูกโหลดหลังจากสิ่งอื่นใด
  • สินทรัพย์คงที่ของคุณ (แบบอักษรรูปภาพ ฯลฯ ) ไปในไดเรกทอรี / สาธารณะ

10

สร้างแพ็คเกจ

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

Meteor อนุญาตให้มีการควบคุมอย่างละเอียดเกี่ยวกับวิธีการโหลดไฟล์ของคุณ (ลำดับการโหลด, โดยที่: ไคลเอนต์ / เซิร์ฟเวอร์ / ทั้งคู่) และแพคเกจการส่งออก

ฉันพบว่ามีประโยชน์มากโดยเฉพาะอย่างยิ่งวิธีง่ายๆในการแบ่งปันตรรกะระหว่างไฟล์ที่เกี่ยวข้อง ตัวอย่างเช่นคุณต้องการใช้ฟังก์ชั่น util และใช้ในไฟล์ต่างๆ คุณเพียงแค่ทำให้มันเป็น "โลก" (โดยไม่ต้องvar) และ Meteor จะใส่ไว้ในเนมสเปซของแพ็คเกจดังนั้นมันจะไม่สร้างมลภาวะเนมสเปซส่วนกลาง

นี่คือเอกสารทางการ


6

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

http://www.matb33.me/2013/09/05/meteor-project-structure.html http://www.manuel-schoebel.com/blog/meteorjs-package-only-app-structure-with-mediator -pattern


6

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

  • events.js
  • helpers.js
  • templates.html
  • routes.js
  • styles.less
  • เป็นต้น

ดูเหมือนว่าในโครงการ:

       ├──การรวมคำขอ
       │├── events.js
       ├──├── helpers.js
       │├── routers.js
       └──└── templates.html
       ├──ลูกค้าหลอก
       │└── routers.js
       ├──แดชบอร์ด
       │├── events.js
       ├──├── helpers.js
       D ├── onDestroyed.js
       │├── onRendered.js
       │├── routers.js
       └──└── templates.html
       ├── email การยืนยัน
       │├── events.js
       ├──├── helpers.js
       │├── routers.js
       └──└── templates.html
       ├──กำลังโหลด
       │├── styles.css
       └──└── templates.html
       ├──กล่องจดหมาย
       ├──├── autoform.js
       ├──├──การรวมขอการยืนยัน
       .j │├── events.js
       ├──│├── helpers.js
       C │├── onCreated.js
       R │├── onRendered.js
       └──│└── templates.html
       │├── events.js
       ├──├── helpers.js

เทมเพลตที่เกี่ยวข้องจะถูกเก็บไว้ด้วยกันในไฟล์เดียวกัน เนื้อหาที่view/order/checkout/templates.htmlแสดงถูกยุบที่นี่:

<template name="orderCheckout"></template>

<template name="paymentPanel"></template>

<template name="orderCheckoutSummary"></template>

<template name="paypalReturnOrderCheckout"></template>

เราใช้โฟลเดอร์ย่อยเมื่อมุมมองมีความซับซ้อนด้วยชิ้นส่วนจำนวนมาก:

       ├──รถเข็น
       ├──├── addItem
       ├──│├── autoform.js
       .j │├── events.js
       ├──│├── helpers.js
       R │├── onRendered.js
       ││├── routers.js
       . │├── styles.less
       └──│└── templates.html
       ├──├──เช็คเอาท์
       ├──│├── autoform.js
       .j │├── events.js
       ├──│├── helpers.js
       R │├── onRendered.js
       ││├── routers.js
       └──│└── templates.html
       มุมมอง│└──
       ├──├── autoform.js
       It ├──ลบรายการ
       .j │├── events.js
       ├──│├── helpers.js
       └──│└── templates.html
       It ├──แก้ไขรายการ
       of │├── autoform.js
       .j │├── events.js
       ├──│├── helpers.js
       └──│└── templates.html
       │├── events.js
       ├──├── helpers.js
       D ├── onDestroyed.js
       │├── onRendered.js
       │├── routers.js
       │├──สไตล์ไม่มี
       └──└── templates.html

เรายังพัฒนาด้วย WebStorm เครื่องมือแก้ไขที่ทรงพลังและยืดหยุ่นสูงสำหรับการพัฒนา Meteor เราพบว่ามีประโยชน์อย่างมากเมื่อทำการค้นหาและจัดระเบียบรหัสของเราและทำงานอย่างมีประสิทธิภาพ มุมมอง Webstorm

ยินดีที่จะแบ่งปันรายละเอียดตามคำขอ


3
โปรดพิจารณาการเพิ่มความคิดเห็นหากคุณคิดว่าคำตอบนี้สามารถปรับปรุงได้
Max Hodges

โพสต์ยอดเยี่ยม คำถาม: หลังจากที่ทุกครั้งที่มีฝนดาวตกคุณยังคงแนะนำสำหรับโครงการขนาดใหญ่เช่นอีคอมเมิร์ซหรือไม่ หรือลองใช้กรอบที่อาจให้ "อิสระ" มากกว่ากับ LoopBack หรือ Happi
Liko

เรารัก Meteor และทำการพัฒนาใหม่ทั้งหมดในนั้น น่าเสียดายที่ฉันไม่คุ้นเคยกับ LoopBack หรือ Happi มากพอที่จะมีความคิดเห็น
Max Hodges

1
LoopBacks มุ่งเน้นไปที่ API ปลายทางแบบครบวงจรทำให้ดูเหมือนเป็นกรอบการพัฒนาเว็บแบบดั้งเดิม (เช่น RoR) RoR ได้รับ REST API ถูกต้อง แต่เรารู้สึกว่า Meteor มีสิทธิ์ตามเวลาจริง
Max Hodges

ขอบคุณสำหรับความคิดเห็น. คุณจัดระเบียบฝั่งเซิร์ฟเวอร์สำหรับคุณสมบัติด้วยหรือไม่
Liko

5

ใช้นั่งร้านเหล็ก CLI ทำสิ่งต่าง ๆ ได้ง่ายมาก

https://github.com/iron-meteor/iron-cli

ติดตั้งครั้งเดียว ใช้iron create my-appเพื่อสร้างโครงการใหม่ มันจะสร้างโครงสร้างต่อไปนี้สำหรับคุณ คุณสามารถใช้สิ่งนี้กับโครงการที่มีอยู่ ใช้iron migrateในไดเรกทอรีโครงการ

my-app/    
 .iron/    
   config.json    
 bin/    
 build/    
 config/    
   development/    
     env.sh    
     settings.json    
 app/    
   client/    
     collections/    
     lib/    
     stylesheets/    
     templates/    
     head.html    
   lib/    
     collections/    
     controllers/    
     methods.js    
     routes.js    
   packages/    
   private/    
   public/    
   server/    
     collections/    
     controllers/    
     lib/    
     methods.js    
     publish.js    
     bootstrap.js

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

@ user2314737 ตะโกนเพื่อบอกว่าผู้ตอบได้แก้ไขโพสต์ของเขา ตอนนี้ได้รวมข้อมูลที่จำเป็นสำหรับปัญหาไว้แล้ว
Kyll

4

ฉันกำลังติดตามฟอร์แมตแผ่นความร้อนด้าน mattdeom ซึ่งรวมถึง iron router & Model (Collection2) อยู่แล้ว ดูด้านล่าง:

client/                 # Client folder
    compatibility/      # Libraries which create a global variable
    config/             # Configuration files (on the client)
    lib/                # Library files that get executed first
    startup/            # Javascript files on Meteor.startup()
    stylesheets         # LESS files
    modules/            # Meant for components, such as form and more(*)
    views/              # Contains all views(*)
        common/         # General purpose html templates
model/                  # Model files, for each Meteor.Collection(*)
private/                # Private files
public/                 # Public files
routes/                 # All routes(*)
server/                 # Server folder
    fixtures/           # Meteor.Collection fixtures defined
    lib/                # Server side library folder
    publications/       # Collection publications(*)
    startup/            # On server startup
meteor-boilerplate      # Command line tool

3

มีวิธีการต่าง ๆ มากมายในการจัดโครงสร้างแอปของคุณ ตัวอย่างเช่นหากคุณมีเราเตอร์และเทมเพลตหน้าต่างๆและภายในแต่ละหน้าเทมเพลตของคุณมีส่วนของหน้าจำนวนมากและอื่น ๆ ฉันจะจัดโครงสร้างมันขึ้นอยู่กับความหมายจากระดับที่สูงกว่า> ระดับล่าง

ตัวอย่างเช่น:

client
  views
    common
      header
        header.html
        header.js
        header.css
      footer
        footer.html
        footer.js
        footer.css
    pages
      mainPage
        mainPage.html
        mainPage.js
        mainPage.css
        articles
          articles.html
          articles.js
          articles.css
        news
          news.html
          news.js
          news.css
     ...

แน่นอนคุณสามารถใส่เทมเพลตข่าวของคุณในโฟลเดอร์ทั่วไปเนื่องจากคุณสามารถใช้เทมเพลตข่าวของคุณในหน้าต่างๆ

ฉันคิดว่ามันเป็นโครงสร้างแอปที่ดีที่สุดในแบบที่คุณพอใจ

ฉันเขียนแอพเล็ก ๆ ที่นี่: http://gold.meteor.com และมันเล็กมากฉันใช้ไฟล์ html เพียงไฟล์เดียวเท่านั้นและไฟล์ template.js เดียวเท่านั้น .. :)

ฉันหวังว่ามันจะช่วยเล็กน้อย


ฉันไม่เห็นคุณค่าในการตั้งชื่อหลาย ๆ ไฟล์ที่มีชื่อคุณสมบัติเช่น "บทความ" ตอนนี้ถ้าคุณต้องการเปลี่ยนชื่อสถานที่เป็น "โพสต์" คุณต้องเปลี่ยนชื่อไฟล์ เพียงแค่จัดระเบียบพวกเขาภายใต้โฟลเดอร์เดียวที่เรียกว่า "บทความ" และตั้งชื่อว่า "events.js", views.html, สไตล์, css ฯลฯ ดูคำตอบของฉันเพิ่มเติม
Max Hodges

3

มีคลาสใหม่เกี่ยวกับEvented Mind ที่เรียกว่าการตั้งค่าโครงการ Meteorที่จัดการสิ่งนี้ แต่ยังพูดถึงการกำหนดค่าโครงการและการตั้งค่าสภาพแวดล้อมการพัฒนาของคุณ

จากวิดีโอโครงสร้างแอปพลิเคชันในชั้นเรียน: Meteor ไม่มีความเห็นที่แข็งแกร่งมากเกี่ยวกับวิธีการจัดโครงสร้างแอปพลิเคชันของคุณ แต่นี่เป็นกฎบางประการ:

1) ลำดับการโหลด - Meteor ไปยังตำแหน่งที่ลึกที่สุดในไดเรกทอรีไฟล์ก่อนและประมวลผลไฟล์ตามลำดับตัวอักษร

2) ไคลเอนต์และเซิร์ฟเวอร์เป็นโฟลเดอร์พิเศษที่ Meteor รู้จัก

โครงสร้างของเรามีลักษณะดังนี้:

both/
    collections/
        todos.js
    controllers/
        todos_controller.js
    views/
        todos.css
        todos.html
        todos.js
    app.js - includes routes
client/
    collections/
    views/
        app.js
server/
    collections/
    views/
        app.js
packages/
public/

todos_controller ขยาย RouteController สิ่งที่มาพร้อมกับ Iron Router

emเครื่องมือดังกล่าวข้างต้นยังได้รับการปรับปรุงใหญ่ในขณะนี้และควรจะดีกว่ามากและมีอยู่ที่: https://github.com/EventedMind/em


มุมมองภายใน / เซิร์ฟเวอร์ / มุมมอง / คืออะไร
stefcud

ฉันไม่เห็นคุณค่าในการตั้งชื่อไฟล์หลาย ๆ ไฟล์ที่มีชื่อคุณสมบัติเช่น "todos" ตอนนี้ถ้าคุณต้องการเปลี่ยนชื่อคุณสมบัติเป็น "งาน" คุณต้องเปลี่ยนชื่อไฟล์ 5 ไฟล์ เพียงแค่จัดระเบียบพวกเขาภายใต้โฟลเดอร์เดียวชื่อ "todos" และตั้งชื่อพวกเขาว่า "events.js", views.html, สไตล์, css ฯลฯ ดูคำตอบของฉันเพิ่มเติม
Max Hodges

1

ฉันกำลังมองหาแนวทางปฏิบัติที่ดีที่สุดเพื่อปรับปรุงและปรับขนาดแอพของฉันผ่านสถาปัตยกรรมที่เข้าใจได้ดี การปฏิบัติที่กล่าวมาทั้งหมดทำงานกับแอพขนาดเล็กถึงขนาดกลาง แต่จะล้มเหลวเมื่อคุณทำงานในทีมที่ใหญ่กว่า มีหลายวิธีที่ฉันได้ลอง:

1) ฉันใช้กลยุทธ์นี้: https://github.com/aldeed/meteor-autoformเพื่อปรับขนาดและนำแม่แบบมาใช้ซ้ำ ผู้เขียนมีความคิดที่ดีมากเกี่ยวกับองค์ประกอบและการออกแบบภาคสนาม ฉันกำลังใช้งานอยู่เนื่องจากชุมชนพัฒนาแพคเกจ 36 ที่ครอบคลุมเกือบทุกกรณีและฉันสามารถใช้TypeScriptเป็นประเภทที่ปลอดภัยในระหว่างขั้นตอนการพัฒนา

<template name="autoForm">
  {{#unless afDestroyUpdateForm this.id}}
  {{! afDestroyUpdateForm is a workaround for sticky input attributes}}
  {{! See https://github.com/meteor/meteor/issues/2431 }}
  <form {{atts}}>
    {{> Template.contentBlock ..}}
  </form>
  {{/unless}}
</template>

นี่คือโพสต์บล็อกที่ดีเกี่ยวกับวิธีการทำ: http://blog.east5th.co/2015/01/13/custom-block-helpers-and-meteor-composability/เช่นเดียวกับที่นี่: http: // meteorpedia .com / อ่าน / Blaze_Notes

2) อันนี้ดูดีมาก แต่ยังไม่ได้รับการปรับปรุงเมื่อเร็ว ๆ นี้ มันเป็นแพคเกจที่เขียนด้วยสคริปต์กาแฟที่เรียกว่า Blaze Components ( https://github.com/peerlibrary/meteor-blaze-components ) สำหรับ Meteor เป็นระบบสำหรับการพัฒนาองค์ประกอบ UI ที่ซับซ้อนได้อย่างง่ายดายซึ่งจำเป็นต้องนำแอป Meteor ของคุณกลับมาใช้ใหม่ คุณสามารถใช้พวกมันได้ใน CoffeeScript, vanilla JavaScript และ ES6 สิ่งที่ดีที่สุดคือส่วนประกอบคือ OOP นี่คือหนึ่งในตัวอย่างของพวกเขา:

class ExampleComponent extends BlazeComponent {
  onCreated() {
    this.counter = new ReactiveVar(0);
  }

  events() {
    return [{
      'click .increment': this.onClick
    }];
  }

  onClick(event) {
    this.counter.set(this.counter.get() + 1);
  }

  customHelper() {
    if (this.counter.get() > 10) {
      return "Too many times";
    }
    else if (this.counter.get() === 10) {
      return "Just enough";
    }
    else {
      return "Click more";
    }
  }
}

ExampleComponent.register('ExampleComponent');

{{> ExampleComponent }}

3) ฉันชอบประเภทและ transpiler ที่บอกฉันว่าที่ไหนและเมื่อไหร่จะเกิดอะไรขึ้น ฉันใช้ TypeScript เพื่อทำงานกับ Meteor และพบที่เก็บต่อไปนี้: https://github.com/dataflows/meteor-typescript-utilsดูเหมือนว่าผู้สร้างพยายามที่จะบรรลุแนวทาง MVC

class MainTemplateContext extends MainTemplateData {
    @MeteorTemplate.event("click #heybutton")
    buttonClick(event: Meteor.Event, template: Blaze.Template): void {
        // ...
    }

    @MeteorTemplate.helper
    clicksCount(): number {
        // ...
    }
}

class MainTemplate extends MeteorTemplate.Base<MainTemplateData> {
    constructor() {
        super("MainTemplate", new MainTemplateContext());
    }

    rendered(): void {
        // ...
    }
}

MeteorTemplate.register(new MainTemplate());

<template name="MainTemplate">
    <p>
        <input type="text" placeholder="Say your name..." id="name">
        <input type="button" value="Hey!" id="heybutton">
    </p>
    <p>
        Clicks count: {{ clicksCount }}
    </p>

    <p>
        <ul>
            {{#each clicks }}
                <li> {{ name }} at <a href="{{pathFor 'SingleClick' clickId=_id}}">{{ time }}</a></li>
            {{/each}}
        </ul>
    </p>
</template>

น่าเสียดายที่โครงการนี้ไม่ได้รับการดูแลหรือพัฒนาอย่างแข็งขัน

4) และฉันคิดว่าถูกกล่าวถึงแล้วคุณสามารถขยายขนาดได้ด้วยแพ็คเกจ นั่นต้องใช้วิธีคิดที่เป็นนามธรรม ดูเหมือนว่าจะใช้งานได้กับ Telescope: https://github.com/TelescopeJS/Telescope

5) meteor-template-extension - ให้วิธีการที่หลากหลายในการคัดลอกตัวช่วยเทมเพลตตัวจัดการเหตุการณ์และ hooks ระหว่างแม่แบบอนุญาตให้ใช้รหัสซ้ำ ข้อเสียคือการคัดลอกทั้งหมดจะต้องได้รับการดูแลโดยนักพัฒนาบ่อยครั้งแล้วครั้งเล่าซึ่งเป็นปัญหาเมื่อโค้ดเบสโตขึ้น ยิ่งไปกว่านั้นหากไม่มีชุมชน API ที่กำหนดไว้อย่างชัดเจนจะไม่สามารถสร้างและแชร์ส่วนประกอบได้

6) Flow Components - Flow Component นั้นใกล้เคียงกับ React ในการออกแบบ API ในขณะที่Blaze Componentsนั้นมีแนวคิดที่คุ้นเคยเช่นบริบทข้อมูลและตัวช่วยเทมเพลต ในขณะที่ส่วนประกอบของ Flow ยังคงใช้ตัวจัดการเหตุการณ์ที่ยึดตามเทมเพลตในขณะที่ Blaze Components ทำให้วิธีการเรียนเป็นแบบง่ายขึ้นเพื่อขยายหรือแทนที่พวกเขาผ่านการสืบทอด โดยทั่วไปส่วนประกอบ Blaze ดูเหมือนว่าจะเป็น OOP ที่มุ่งเน้นมากขึ้น คอมโพเนนต์การไหลยังไม่เปิดตัวอย่างเป็นทางการ ( เครดิตข้อความสำหรับ # 5 และ # 6 https://github.com/peerlibrary/meteor-blaze-components#javascript-and-es6-support )

หมายเลข 2 และ 3 จำเป็นต้องใช้งานด้วยเช่นกัน แต่คุณจะได้รับความเร็วในการพัฒนาเมื่อเวลาผ่านไป หมายเลขสี่ให้คุณสร้างและทดสอบส่วนประกอบเพื่อทำให้รหัสของคุณมีเสถียรภาพมากขึ้น หมายเลขสามมาพร้อมกับข้อดีของการรักษาความปลอดภัยแบบเต็มรูปแบบของ typescript ซึ่งเป็นข้อดีอย่างมากเมื่อคุณพัฒนาทีมที่มีเอกสารไม่ดี อย่างไรก็ตามตอนนี้ฉันกำลังย้ายหมายเลขสองไปที่ TypeScript เพราะฉันรู้สึกสะดวกสบายในการทำงานกับมันและฉันไม่ต้องไปดูแพ็คเกจคอมไพเลอร์เพื่อให้ทำงานกับ Meteor เมื่อฉันไม่ได้ใช้ Gulp

ยังคงหาวิธีที่เหมาะสมในการทำงานกับ Meteor คุณต้องคิดออกด้วยตัวคุณเองไม่งั้นคุณจะได้โครงสร้างโฟลเดอร์ที่จัดเรียงไว้อย่างดี แต่คุณไม่มีเงื่อนงำว่าทุกอย่างอยู่ที่ไหน การเข้ารหัสที่มีความสุข

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