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

我开始学习Node.js和Backbone。 我想分享服务器和客户端之间的一些代码(涉及[1]和[2] )。 更深层次:

  • 共享模型的默认值 。 默认值用于填充表单(客户端),而在服务器端执行
  • 共享validation规则 ,以便DRY并执行客户端/服务器validation
  • 共享实例方法

所以我的想法是使用factory对象封装通用代码(默认,validation规则,公共实例方法),并根据环境(Node.js或AMD模块)调整factory对象。

此代码是快速和肮脏的,可能无法正常工作。 这是一个好方法还是浪费时间?

 (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 } } })); 

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

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

就目前而言,我会build议寻找“吞噬”stream式构build系统。 使用它,你会发现把你的共享js脚本放到一个可公开访问的目录中非常容易,然后可以从客户端加载它。 将节点js模块转换为浏览器脚本的常用技巧是使用“browserify” – magic!

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

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