我开始学习 Node.js 和 Backbone。我想在服务器和客户端之间共享一些代码(与 [1] 和 [2] 相关)。更深入:
- 共享模型的默认值。默认值用于填充表单(客户端),而它们在服务器端强制执行
- 共享验证规则以实现DRY并执行客户端/服务器验证
- 共享实例方法
所以我的想法是使用一个factory
对象来封装公共(public)代码(默认值、验证规则、公共(public)实例方法)并根据环境适配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
}
}
}));
最佳答案
我认为使用 require.js 是更好的解决方案(特别是对于在多个文件中使用像下划线这样的框架)。您应该只对在运行时发生变化的对象使用工厂。例如购物车(但即使在这个例子中,我认为使用主干集合更合适,该集合在实例化时作为参数提供给您的函数)。 在此处查看更多信息:http://requirejs.org/docs/node.html
关于javascript - 在服务器和客户端之间共享 JavaScript 模型代码,这种方法有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14789183/