如何在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也有存储库 。