すべての例(リーダーボード、ワードプレイなど)では、1つのHTMLテンプレートファイルがあります。ベストプラクティスの例として使用できる、さまざまなHTMLテンプレートファイルを含む大きなオープンソースのMeteorプロジェクトはありますか?大規模なアプリが必要とするすべてを1つのテンプレートファイルにまとめるのは実用的ではないようです。
すべての例(リーダーボード、ワードプレイなど)では、1つのHTMLテンプレートファイルがあります。ベストプラクティスの例として使用できる、さまざまなHTMLテンプレートファイルを含む大きなオープンソースのMeteorプロジェクトはありますか?大規模なアプリが必要とするすべてを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's a really
> convenient way to ship HTML templates to the client. See the templates
> section for more.
非公式の流星のよくある質問と同様に、大規模なアプリを構築する方法もほぼ説明されていると思います。
ファイルはどこに置くべきですか?
流星のサンプルアプリは非常にシンプルであり、洞察をあまり提供しません。これを行うための最良の方法についての私の現在の考えは次のとおりです(提案/改善は大歓迎です!)
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
mobile-config.js
か手掛かりがありますか?
私はyagooarに同意しますが、代わりに:
client / application.js
使用する:
client / main.js
main。*ファイルは最後にロードされます。これは、ロード順の問題がないことを確認するのに役立ちます。詳細については、Meteorのドキュメントhttp://docs.meteor.com/#structuringyourappを参照してください。
Meteorは、ほとんどどのような方法でもアプリを構築できるように設計されています。そのため、構造が気に入らない場合は、ファイルを新しいディレクトリに移動するか、1つのファイルを複数の部分に分割して、Meteorにほとんど同じようにすることができます。メインのドキュメントページhttp://docs.meteor.com/で指定されているクライアント、サーバー、パブリックディレクトリの特別な扱いに注意してください。
すべてを1つのHTMLの塗りつぶしにまとめるだけでは、ベストプラクティスとしては明らかになりません。
これが可能な構造の例です:私のアプリの1つ、ディスカッションフォーラムで、モジュールまたは「ページタイプ」(ホーム、フォーラム、トピック、コメント)で整理し、それぞれに.css、.html、および.jsファイルを置きますページを1つのディレクトリにまとめて入力します。また、共通の.cssおよび.jsコードを含む「ベース」モジュールと、ルーターに応じて{{renderPage}}を使用して他のモジュールの1つをレンダリングするマスターテンプレートもあります。
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
私はいくつかのより具体的なベストプラクティス構造と命名規則が浮かび上がることを願っています。
このトピックについてグーグルするすべての人のために:
em
新しい流星のAppを談合とき(EventedMindすることにより、鉄のルータの背後にある男)コマンドラインツールは非常に有用です。それは素晴らしいファイル/フォルダー構造を作成します。すでにアプリに取り組んでいて、それを再編成したい場合は、で新しいプロジェクトをセットアップするだけで、em
それをインスピレーションに使用できます。
参照:https : //github.com/EventedMind/em
そしてここ:https : //stackoverflow.com/questions/17509551/what-is-the-best-way-to-organize-templates-in-meteor-js
Discover Meteor Bookのファイル構造は本当に良いものであり、しっかりとしたスタートです。
/app:
/client
main.html
main.js
/server
/public
/lib
/collections
もちろん、すべてがこのアプローチに当てはまるわけではありませんが、大きなアプリでは、分離できる機能がたくさんあります。分離可能で再利用可能なものはすべてパッケージに収まり、他の回答で述べたように、残りは通常のディレクトリ構造になります。オーバーヘッドを回避するためにパッケージを作成しない場合でも、モジュール方式でコードを構造化することをお勧めします(これらの提案を参照)
Meteorでは、ファイルの読み込み方法(読み込み順序、クライアント/サーバー/両方)とパッケージがエクスポートする内容をきめ細かく制御できます。
特に、関連ファイル間でロジックを共有する簡単な方法がとても便利だと思います。たとえば、util関数をいくつか作成し、別のファイルで使用したいとします。あなたは単にそれを「グローバル」(なしvar
)にし、Meteorはそれをパッケージの名前空間にラップするので、グローバル名前空間を汚染しません
これが公式のドキュメントです
meteorjsのコーディングからしばらく経ってから、かなり複雑なオンラインゲームの構築に専念できる時間があるので、私は幸せです。アプリの構造は私の最初の懸念事項の1つであり、機能的に異なるパッケージを緩やかに結合できるアプリを構造化するパッケージのみの方法を支持する優れたプログラマーが何人かいるようです。このアプローチには他にも利点があり、アプローチを説明する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 -パターン
私たちには大きなプロジェクトがあります(おそらく、1.5年間フルタイムで開発されていたため、これまでに誰もが構築した最大のMeteorプロジェクトの1つです)。各ビューで同じファイル名のセットを使用します。非常に一貫性があり、探しているものにすばやく移動できます。
プロジェクトでは次のようになります。
├──consolidationRequests │├──events.js │├──helpers.js │├──routers.js │└──templates.html ├──customerSpoof │└──routers.js ├──ダッシュボード │├──events.js │├──helpers.js │├──onDestroyed.js │├──onRendered.js │├──routers.js │└──templates.html ├──emailVerification │├──events.js │├──helpers.js │├──routers.js │└──templates.html ├──ローディング │├──styles.css │└──templates.html ├──メールボックス │├──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>
多くのパーツでビューが複雑になる場合は、サブフォルダーを使用します。
├──カート │├──addItem ││├──autoform.js ││├──events.js ││├──helpers.js ││├──onRendered.js ││├──routers.js ││├──styles.less ││└──templates.html │├──チェックアウト ││├──autoform.js ││├──events.js ││├──helpers.js ││├──onRendered.js ││├──routers.js ││└──templates.html │└──表示 │├──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
また、Meteor開発用の非常に強力で柔軟なエディターであるWebStormを使用して開発します。コードを検索して整理し、生産的に作業する際に非常に役立ちます。
リクエストに応じて詳細を共有させていただきます。
iron-cli scaffolding 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
私はマットアイアンボイラープレート形式に従っています。これには、すでにアイアンルーターとモデル(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
アプリの構造化にはさまざまなアプローチがあります。たとえば、ルーターとさまざまなページテンプレートがあり、各ページテンプレートの内部に多くのページパーツがある場合などは、上位から下位のセマンティクスに応じて構造化します。
例えば:
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
...
もちろん、別のページでニューステンプレートを使用できるので、ニューステンプレートをcommonフォルダーに置くこともできます。
私はあなたが快適にアプリを構成するのが最善だと思います。
私はここに小さなアプリを書きました:http : //gold.meteor.com そしてそれはとても小さいので、私は1つのhtmlファイルと1つのtemplate.jsファイルのみを使用します。
少しお役に立てば幸いです
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ではるかに改善されて利用可能になるはずです。
また、よく考えられたアーキテクチャを通じてアプリを拡張およびスケーリングするためのベストプラクティスも探しています。上記のプラクティスはすべて、中小規模のアプリで機能しますが、大きなチームで作業すると失敗します。私が試したいくつかの方法があります:
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)これはとても有望に見えますが、最近更新されていません。というコーヒースクリプトで書かれたパッケージです。MeteorのBlazeコンポーネント(https://github.com/peerlibrary/meteor-blaze-components)は、Meteorアプリで再利用する必要がある複雑なUI要素を簡単に開発するためのシステムです。CoffeeScript、vanilla JavaScript、ES6で使用できます。最良のことは、コンポーネントがOOPであることです。以下はその例の1つです。
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)フローコンポーネント – API設計ではフローコンポーネントがReactに近く、Blazeコンポーネントはデータコンテキストやテンプレートヘルパーなどの使い慣れた概念を維持しています。一方、フローコンポーネントは引き続きテンプレートベースのイベントハンドラーを使用しますが、Blazeコンポーネントはそれらをクラスメソッドにして、継承による拡張やオーバーライドを容易にします。一般に、BlazeコンポーネントはよりOOP指向であるようです。フローコンポーネントはまだ正式にリリースされていません(#5および#6のテキストクレジットhttps://github.com/peerlibrary/meteor-blaze-components#javascript-and-es6-support)
2番と3番もある程度慣れる必要がありますが、時間の経過とともに開発速度が向上します。4つ目は、コンポーネントをビルドおよびテストして、コードをより安定させることです。3番目には、Typescriptの完全な型安全性という利点があります。これは、不十分なドキュメントを使用してチームで開発する場合に非常に役立ちます。しかし、私は現在TypeScriptに2番を移植しています。GScriptを使用していないときにMeteorで動作させるためにコンパイラーパッケージを調整する必要がないからです。
Meteorを操作する正しい方法を見つけるのは依然として困難です。あなたはそれを自分で理解する必要があります。そうしないと、うまく整理されたフォルダ構造になってしまいますが、すべてがどこにあるのか手掛かりがありません。ハッピーコーディング。