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

时间:2014-03-31 11:56:09

标签: javascript node.js angularjs express code-reuse

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

我实现了一个AngularJS应用程序。现在我需要实现一个RESTful服务器,为客户端提供数据。一些客户端角度服务可以在服务器上重复使用,例如Facebook / Google / Twitter的第三方restful-clients,它们密集使用角度依赖注入,并且依赖于$http,{{ 1}}和许多其他服务。

理想情况下,由于我非常喜欢AngularJS中包含的依赖注入框架,我会发现有一种基于AngularJS的服务器框架非常好。一种服务器框架,包括依赖注入框架和与UI无关的所有角度服务,并添加所需的服务器端功能,如路由和身份验证。但不幸的是,我没有找到任何解决方案。 (请告诉我这个框架是否存在!)

那么,为了至少在客户端和服务器之间重用代码,还有什么选择呢?特别是根据$q$http以及角度框架和角度第三方(如$q)中包含的其他AngularJS服务,重新使用代码代码。

3 个答案:

答案 0 :(得分:6)

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

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

  

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


如果你想要更多挑选樱桃,你可能应该等待角度2.0

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

再次...... Ben Clinkinbeard。在 THIS TALK 中,他介绍了如何在角度项目中使用browserify。这种方法的一个很酷的特性是,您可以将您的函数/对象声明为单独的实体,无论如何都不会与角度耦合;所以它们也可以在不同的环境中重复使用。

一个例子:

<强> 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;

答案 1 :(得分:1)

在这里使用RequireJS是有道理的。

而不是像Angular一样在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));

选中此Videos以获取有关如何实施此功能的良好示例,该视频中还有repository

答案 2 :(得分:1)

Angular 1.x是一个非常独立的框架。有一个计划将功能区分开来,但这将在版本2中出现。所以这很简单,只需为浏览器和node.js提供$ httpBackend的不同实现。

我创建了一个简单的演示如何使用CommonJS share code between node.js and browser。这可以用于共享验证,模型等。