我开始学习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
}
}
}));
答案 0 :(得分:1)
我认为使用require.js是一个更好的解决方案(特别是在多个文件中使用下划线等框架)。您应该仅将工厂用于在运行时更改的对象。以购物车为例(但即使在这个例子中,我认为使用在实例化时作为参数赋予函数的主干集合更合适)。 请在此处查看更多信息:http://requirejs.org/docs/node.html
答案 1 :(得分:1)
就个人而言,我会远离requirejs,因为它需要你重写你的模块以适应他们的规范,随着Ecmascript标准的发展最终会失效。
暂时,我会建议调查“gulp'流式构建系统。使用它,您可以非常轻松地将共享的js脚本传送到可公开访问的目录中,然后可以从客户端加载该目录。将节点js模块转换为浏览器脚本的常用技术是使用' browserify' - 魔法!
流程:gulp.src> gulp-browserify> gulp.dest> ??? >利润。