如何在AngularJS客户端和Node.js服务器之间重新使用代码

为了在AngularJS客户端和Node.js服务器之间重用/共享代码,最佳做法是什么?

我实现了一个AngularJS应用程序。 现在我需要实现一个为客户端提供数据的RESTful-server。 一些客户端angular度服务可以在服务器上重新使用,例如Facebook / Google / Twitter的第三方宁静客户端,它们使用angular度dependency injection,并且依赖于$http$q和许多其他服务。

理想情况下,因为我非常喜欢AngularJS中包含的dependency injection框架,所以我觉得有一种基于AngularJS的服务器框架非常好。 包含dependency injection框架和所有与UI无关的angular度服务的服务器框架,以及添加所需的服务器端function(如路由和身份validation)。 但不幸的是,我没有find任何解决scheme。 (请告诉我,如果这样的框架存在!)

那么,为了至less能够在客户端和服务器之间重新使用代码,还有什么替代scheme呢? 特别是启用的代码重用代码取决于$http$q和angular度框架和angular第三方(如angular-cache )中包含的其他AngularJS服务。

在非浏览器环境中使用angular度

Ben Clinkinbeard将angular度分布作为commonJS模块( HERE )准备,可以在非浏览器环境中运行:

AngularJS用jsdom编译并作为CommonJS模块提供。 用于testingAngularJS代码而不依赖于浏览器。


如果你想更挑选樱桃,你可能应该等待angular2.0

在客户端和服务器端共享代码

再次…本Clinkinbeard。 在这篇讲话中,他描述了如何在angular度项目中使用browserify。 这种方法的一个很酷的function是,你可以声明你的函数/对象作为单独的实体,而不是以任何方式与angular度耦合; 所以它们可以在不同的环境中重复使用。

它的一个例子:

app.js

 var app = angular.module('someModule',[]); ... app.factory('someService', require('./some/path.js')); ... 

./some/path.js

 module.exports = function(dep1, dep2){ ... return { ... } } module.exports.$inject['dep1', 'dep2']; // for minification; 

Angular 1.x是相当独立的框架。 有一个打破function分开的计划,但这将在版本2。所以这将是简单的,只是提供不同的实现$ httpBackend为浏览器和node.js。

我已经创build了一个简单的演示如何使用CommonJS 共享node.js和浏览器之间的代码 。 这可以用于分享validation,模型等

在这里使用RequireJS是有意义的。

而不是像这样在Angular中定义你的模型/服务:

 (function (angular) { "use strict"; angular.module('myModule').factory('MyModel', function (Deps) { var Model = function () { // do things here }; return Model; }); }(window.angular)); 

你会这样分裂它在2个文件中:

model.js:

 (function (define) { "use strict"; define([], function () { var factoryConstructor = function (deps) { var Model = function () { // do things here }; return Model; }; return factoryConstructor; }); }(window.define)); 

whatever.js

 (function (define, angular) { "use strict"; define(['Model'], function (Model) { angular.module("myModule").factory("myModel", Model); }); }(window.define, window.angular)); 

查看这个video是关于如何实现这个的一个很好的例子,这个video也有存储库 。