CoffeeScript と Grunt を使用する非常に大きな単一ページ アプリケーションに RequireJS を実装したいと考えています。モジュール (サービス、バックボーンなど) ごとに個別のファイルがあります。
RequireJS の実装は非常に簡単です。私の主な問題は、アプリケーションのサイズと CoffeeScript の空白の感度にあります。RJS を実装しながら、新しい機能を継続的に開発できる必要があります。これができない理由は、define 呼び出しですべてのファイルをラップし、ファイルを再タブ化する必要があるためです。このコードをリベースしようとすると、タブ移動が原因で大規模なマージ競合が発生します。RJS より前に新機能やバグ修正が導入されている可能性があるため、これらの問題をすべて解決する時間は誰にもありません。
私はいくつかの可能な解決策を調査しました:
開発を停止し、すべてを再タブします。ファイルがタブ化され、コードが実際に RJS で動作するまで開発が停止されるため、これは最悪です。
CommonJS パターンを使用し、RJS 最適化前の RJS CommonJS コンバーターを使用します。ハッキーなようです。
- CoffeeScript
backtick
機能を使用して、標準の JavaScript モジュール パターンで CoffeeScript クラスをラップします。次に、CoffeeScript クラスの「モジュール」ラッパーに依存関係を渡し、ファイルの RJS 呼び出し内で「モジュール」を初期化します。
編集:垂直構造に関するヒントと、関数の引数をそのように渡す方法(コンマなし)を紹介してくれてありがとう。私たちのプロジェクトは構造が非常に似ています (残念ながら現時点では grunt-contrib-coffeee が lint を実行することを除いて)、単一のファイルをコンパイルするためのカスタム ウォッチ タスクも作成しています (vs. glob パターン)。
この非常に基本的な例を考えてみましょう:
view.coffee
:
class View
template: Helper.template
constructor: (@options) ->
render: (meters) ->
$('body').html @template @options
通常のプロセスは、RJS で次のようなことを行うことです。
define [
'jQuery'
'Helper'
], (
$
Helper
) ->
class View
template: Helper.template 'base_view'
constructor: (@options) ->
render: (meters) ->
$('body').html @template @options
クラス全体がどのように再タブ化されているかに注目してください。View
私がrequireを並行して実装しようとしているときに、開発者の誰かがやって来てクラスを変更した場合、Gitはこれを嫌うでしょう。
バックティックのアイデアは機能しません。グローバルな問題を回避できません。
`var exports = function($, Helper) {
class View
template: Helper.template
constructor: (@options) ->
render: (meters) ->
$('body').html @template @options
return View }(jQuery, Helper)`
define [
'jQuery'
'Helper'
], (
$
Helper
) ->
return exports($, Helper)
私の最善の策は、すべてのアプリケーション機能をまとめてマージし、すべてのファイルに必要な 2 つのスペースをすべて 1 つのコミットで再タブ化するために一時停止することだと思います。ファイルの残りの部分がそのパターンに従っている限り、CoffeeScript はインデントの開始位置 (列 0 と列 2) を気にしないようです。このように、RJS をスライドインして段階的に実装し、解決できないマージの競合を防ぐことができるはずです。