Каковы наилучшие методы структурирования большого приложения Meteor со многими файлами шаблонов HTML?

Во всех примерах (таблица лидеров, wordplay и т.д.) у них есть один шаблонный файл HTML. Есть ли большой проект Meteor с открытым исходным кодом со многими различными файлами шаблонов HTML, которые мы можем использовать в качестве примера лучшей практики? Кажется нецелесообразным размещать все, что требуется большому приложению, в одном файле шаблона.

Ответ 1

Убей все вместе! Из документов:

> 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 a really
> convenient way to ship HTML templates to the client. See the templates
> section for more.

Ответ 2

Как и в неофициальном meteor faq, я думаю, что это в значительной степени объясняет, как структурировать большое приложение:

Где мне поместить мои файлы?

Примеры приложений в метеоре очень просты и не дают большого понимания. Вот мой взгляд на лучший способ сделать это: (любые предложения и улучшения очень приветствуются!)

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

Узнайте больше: Неофициальный FAQ Meteor

Ответ 3

Я согласен с yagooar, но вместо:

client/application.js

Использование:

client/main.js

main. * файлы загружаются последними. Это поможет убедиться, что у вас нет проблем с загрузкой. Подробнее см. Документацию Meteor, http://docs.meteor.com/#structuringyourapp.

Ответ 4

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

Я надеюсь, что некоторые более конкретные структуры передовой практики и соглашения об именах появятся, хотя.

Ответ 5

Для всех, кто работает в этой теме:

Инструмент командной строки em (от EventedMind, ребята из Iron Router) очень полезен при оснащении нового приложения Meteor. Это создаст хорошую структуру файлов/папок. Если вы уже работаете в приложении и хотите его реорганизовать, просто настройте новый проект с помощью em, и вы можете использовать его для вдохновения.

Смотрите: https://github.com/EventedMind/em

И здесь: https://stackoverflow.com/questions/17509551/what-is-the-best-way-to-organize-templates-in-meteor-js

Ответ 6

Я думаю, что файловая структура из Discover Meteor Book действительно хороша и прочная.

/app: 
 /client
   main.html
   main.js
 /server 
 /public
 /lib
 /collections
  • Код в каталоге /server работает только на сервере.
  • Код в каталоге /client работает только на клиенте.
  • Все остальное работает как на клиенте, так и на сервере.
  • Файлы в /lib загружаются прежде всего.
  • Любой основной. * файл загружается после всего остального.
  • Ваши статические активы (шрифты, изображения и т.д.) входят в каталог /public.

Ответ 7

Создание пакетов

Конечно, не все подходит для этого подхода, но в больших приложениях у вас будет много функций, которые можно изолировать. Все, что отделимо и многократно используется в пакетах, остальное относится к обычной структуре каталогов, как упоминалось в других ответах. Даже если вы не делаете пакеты, чтобы избежать накладных расходов, структурирование кода модульным способом - это хорошая идея (см. эти предложения)

Meteor позволяет мелкомасштабный контроль над тем, как вы загружаете свои файлы (порядок загрузки, где: клиент/сервер/оба) и то, что экспортирует пакет.

Мне особенно удобно найти простой способ поделиться логикой между связанными файлами. Скажем, например, вы хотите сделать некоторые функции использования и использовать их в разных файлах. Вы просто делаете его "глобальным" (без var), а Meteor будет обертывать его в пространстве имен пакета, поэтому он не будет загрязнять глобальное пространство имен

Здесь официальный документ

Ответ 8

Через некоторое время из кодирования метеоритов я рад, что у меня есть свободное время, чтобы посвятить себя созданию довольно сложной онлайн-игры. Структура приложения была одной из моих первых проблем, и похоже, что несколько очень хороших программистов отстаивали только пакетный метод структурирования приложения, что позволяет вам свободно сочетать функционально разные пакеты. Есть другие преимущества подхода, и 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

Ответ 9

У нас есть большой проект (возможно, один из крупнейших проектов Метеор, который был построен на сегодняшний день, так как он был полностью занят в течение 1,5 лет). Мы используем один и тот же набор имен файлов в каждом представлении. Он очень последователен и помогает нам быстро ориентироваться именно на то, что мы ищем:

  • events.js
  • helpers.js
  • templates.html
  • routes.js
  • styles.less
  • и др.

Похоже, что в проекте:

       ├── consolidationRequests
       │   ├── events.js
       │   ├── helpers.js
       │   ├── routers.js
       │   └── templates.html
       ├── customerSpoof
       │   └── routers.js
       ├── dashboard
       │   ├── events.js
       │   ├── helpers.js
       │   ├── onDestroyed.js
       │   ├── onRendered.js
       │   ├── routers.js
       │   └── templates.html
       ├── emailVerification
       │   ├── events.js
       │   ├── helpers.js
       │   ├── routers.js
       │   └── templates.html
       ├── loading
       │   ├── styles.css
       │   └── templates.html
       ├── mailbox
       │   ├── autoform.js
       │   ├── consolidationRequestConfirmation
       │   │   ├── events.js
       │   │   ├── helpers.js
       │   │   ├── onCreated.js
       │   │   ├── 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>

Мы используем подпапки, когда представления становятся сложными с большим количеством частей:

       ├── cart
       │   ├── addItem
       │   │   ├── autoform.js
       │   │   ├── events.js
       │   │   ├── helpers.js
       │   │   ├── onRendered.js
       │   │   ├── routers.js
       │   │   ├── styles.less
       │   │   └── templates.html
       │   ├── checkout
       │   │   ├── autoform.js
       │   │   ├── events.js
       │   │   ├── helpers.js
       │   │   ├── onRendered.js
       │   │   ├── routers.js
       │   │   └── templates.html
       │   └── view
       │       ├── autoform.js
       │       ├── deleteItem
       │       │   ├── events.js
       │       │   ├── helpers.js
       │       │   └── templates.html
       │       ├── editItem
       │       │   ├── autoform.js
       │       │   ├── events.js
       │       │   ├── helpers.js
       │       │   └── templates.html
       │       ├── events.js
       │       ├── helpers.js
       │       ├── onDestroyed.js
       │       ├── onRendered.js
       │       ├── routers.js
       │       ├── styles.less
       │       └── templates.html

Мы также разрабатываем с помощью WebStorm, чрезвычайно мощный и гибкий редактор для разработки Meteor. Мы находим это очень полезным при поиске и организации нашего кода и работе продуктивно. Просмотр Webstorm

С удовольствием сообщаем подробности по запросу.

Ответ 10

Я следую формату шаблона mattdeom, который уже включает железный маршрутизатор и модель (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

Ответ 11

Используйте 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

Ответ 12

Существует множество различных подходов к структурированию вашего приложения. Например, если у вас есть маршрутизатор и разные шаблоны страниц, а внутренний шаблон каждой страницы имеет много частей страницы и т.д., Я бы структурировал его в зависимости от семантики от более высокого > нижнего уровня.

Пример:

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..:)

Я надеюсь, что это поможет немного

Ответ 13

В новом классе Evented Mind называется Настройка проектов Meteor, который обращается к этому, но также говорит о конфигурации проекта и настройке среды разработки.

Из Application Structure видео в классе: у 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

Ответ 14

Я также ищу лучшие практики для улучшения и масштабирования приложений через хорошо продуманную архитектуру. Все вышеупомянутые практики работают для приложений малого и среднего размера, но не работают, когда вы работаете в более крупной команде. Есть несколько способов, которые я пробовал:

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

2) Этот выглядит так многообещающе, но не обновлялся в последнее время. Это пакет, написанный на кофе script. Компоненты Blaze (https://github.com/peerlibrary/meteor-blaze-components) для Meteor - это система для легкого развития сложных элементов пользовательского интерфейса, которые необходимо повторно использовать вокруг вашего приложения Meteor. Вы можете использовать их в CoffeeScript, ванильном 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) Мне нравятся типы и транспилеры, которые говорят мне, где и когда что-то пойдет не так. Я использую 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), и я думаю, что уже упоминалось, вы можете масштабировать, используя пакеты. Это требует хорошего абстрактного мышления. Кажется, что работает для телескопа: https://github.com/TelescopeJS/Telescope

5) meteor-template-extension - предоставляет различные способы копирования помощников шаблонов, обработчиков событий и перехватов между шаблонами, позволяющих повторно использовать код; Недостатком является то, что все копирование необходимо заботиться разработчиком, часто снова и снова, что становится проблематичным по мере роста кодовой базы; кроме того, без четко определенного сообщества API не могут создавать и обмениваться компонентами

6) Компоненты потока - Компоненты потока ближе к React в дизайне API, а Компоненты Blaze поддерживают знакомые понятия, такие как контексты данных и помощники шаблонов; Компоненты потока, с другой стороны, по-прежнему используют обработчики событий на основе шаблонов, в то время как компоненты Blaze составляют их методы класса, поэтому проще расширить или переопределить их через наследование; в целом компоненты Blaze, похоже, больше ориентированы на ООП; Компоненты потока еще не официально выпущены (текстовые кредиты для # 5 и # 6 https://github.com/peerlibrary/meteor-blaze-components#javascript-and-es6-support)

Число 2 и 3 тоже нуждается в некотором использовании, но со временем вы получите скорость разработки. Номер четыре позволяет создавать и тестировать компоненты, чтобы сделать ваш код более стабильным. Номер три имеет преимущество полной безопасности Typescript, что является огромным плюсом, когда вы разрабатываете команду с плохой документацией. Однако в настоящее время я переношу номер два на TypeScript, потому что мне очень удобно работать с ним, и мне не нужно поддразнивать пакет компилятора, чтобы он работал с Meteor, когда я не использую Gulp.

До сих пор трудно найти правильный способ работы с Meteor. Вам нужно разобраться в этом сами, иначе вы получите красивую структуру папок, но вы не знаете, где все. Счастливое кодирование.