1

Node.js と Backbone の学習を開始しています。サーバーとクライアントの間でいくつかのコードを共有したいと思います ( [1][2]に関連)。さらに深く:

  • モデルのデフォルト値を共有します。デフォルトはフォーム (クライアント側) に入力するために使用されますが、サーバー側では適用されます
  • DRY であるために検証ルールを共有し、クライアント/サーバー検証を実行する
  • インスタンス メソッドを共有する

したがって、私の考えは、factoryオブジェクトを使用して共通コード (デフォルト、検証ルール、パブリック インスタンス メソッド) をカプセル化factoryし、環境 (Node.js または AMD モジュール) に基づいてオブジェクトを適応させることです。

このコードはクイック&ダーティであり、機能しない可能性があります。これは良いアプローチですか、それとも単に時間の無駄ですか?

(function (factory) {
    if (typeof exports === 'object') { // Node.js
        var config    = require('../config/config.json'),
            Sequelize = require('sequelize'),
                    _ = require('underscore');

        var User = {
            receiveSms: {
                type: Sequelize.BOOLEAN, allowNull: false
            },
            receiveNewsletter: {
                type: Sequelize.BOOLEAN, allowNull: false
            }
        };

        // Add defaultValue for each returned by 
        _.each(factory.defaults, function (value, key) {
            if(_.has(User, key)) {
                User[key].defaultValue = value;
            }
        });

        module.exports = function () {
            (new Sequelize(config.database, config.username, config.password))
                .define('User', User);
        };
    } else if (typeof define === 'function' && define.amd) { // AMD
        define(['backbone', 'uderscore'], function (Backbone, _) {
            return Backbone.Model.extend(factory);
        });
    }
}(function () {
    return { // To be adapted
        defaults: {
            receiveSms: false,
            receiveNewsletter: true
        }
    }
}));
4

2 に答える 2

1

個人的には、モジュールを仕様に合わせて書き直す必要があるため、requirejs は避けたいと思います。これは、Ecmascript 標準が進化するにつれて最終的に機能しなくなります。

当面は、'gulp' ストリーミング ビルド システムを検討することをお勧めします。これを使用すると、共有 js スクリプトをパブリックにアクセス可能なディレクトリにパイプするのが非常に簡単であることがわかります。このディレクトリは、クライアント側からロードできます。ノード js モジュールをブラウザー スクリプトに変換するための一般的な手法は、'browserify' を使用することです。

プロセス: gulp.src > gulp-browserify > gulp.dest > ??? >利益。

さらに読む: http://viget.com/extend/gulp-browserify-starter-faq

于 2014-11-04T20:38:07.020 に答える
1

require.js を使用する方が良い解決策だと思います (特に、複数のファイルでアンダースコアのようなフレームワークを使用する場合)。ファクトリは、実行時に変更されるオブジェクトに対してのみ使用する必要があります。たとえば、ショッピング カート (ただし、この例でも、インスタンス化されたときに関数に引数として渡されるバックボーン コレクションを使用する方が適切だと思います)。詳細については、http: //requirejs.org/docs/node.htmlを参照してください。

于 2013-02-09T14:51:28.737 に答える