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 脚本通过管道传输到可公开访问的目录非常容易,然后可以从客户端加载该目录。将 node js 模块转换为浏览器脚本的一种常用技术是使用“浏览器”-魔术!

进程: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 回答