在服务器和客户端之间共享JavaScript模型代码,这种方法有效吗?

时间:2013-02-09 14:36:38

标签: javascript node.js backbone.js requirejs amd

我开始学习Node.js和Backbone。我想在服务器和客户端之间共享一些代码(与[1][2]相关)。更深入:

  • 为模型分享默认值。默认值用于填充表单(客户端),而强制执行服务器端
  • 分享验证规则以便干预并执行客户端/服务器验证
  • 分享实例方法

所以我的想法是使用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
        }
    }
}));

2 个答案:

答案 0 :(得分:1)

我认为使用require.js是一个更好的解决方案(特别是在多个文件中使用下划线等框架)。您应该仅将工厂用于在运行时更改的对象。以购物车为例(但即使在这个例子中,我认为使用在实例化时作为参数赋予函数的主干集合更合适)。 请在此处查看更多信息:http://requirejs.org/docs/node.html

答案 1 :(得分:1)

就个人而言,我会远离requirejs,因为它需要你重写你的模块以适应他们的规范,随着Ecmascript标准的发展最终会失效。

暂时,我会建议调查“gulp'流式构建系统。使用它,您可以非常轻松地将共享的js脚本传送到可公开访问的目录中,然后可以从客户端加载该目录。将节点js模块转换为浏览器脚本的常用技术是使用' browserify' - 魔法!

流程:gulp.src> gulp-browserify> gulp.dest> ??? >利润。

进一步阅读:http://viget.com/extend/gulp-browserify-starter-faq