Подтвердить что ты не робот

Как повторно использовать код между клиентом AngularJS и сервером Node.js

Каковы наилучшие методы для повторного использования/совместного использования кода между клиентом AngularJS и сервером Node.js?

Я применил приложение AngularJS. Теперь мне нужно реализовать RESTful-сервер, предоставляющий клиенту данные. Некоторые клиентские службы angular могут быть повторно использованы на сервере, например, сторонние клиенты-клиенты в Facebook/Google/Twitter, интенсивно использующие инъекцию зависимостей angular и зависящие от $http, $q и многие другие сервисы.

В идеале, поскольку мне очень нравится инфраструктура инъекций зависимостей, включенная в AngularJS, мне было бы очень приятно иметь своего рода серверную структуру на основе AngularJS. Сервер-инфраструктура, которая включает в себя инфраструктуру внедрения зависимостей и все angular -службы, которые не связаны с пользовательским интерфейсом, и добавление необходимых функций на стороне сервера, таких как маршрутизация и аутентификация. Но, к сожалению, я не нашел решения таким образом. (Пожалуйста, скажите мне, существует ли такая основа!)

Итак, что было бы альтернативой, чтобы хотя бы разрешить повторное использование кода между клиентом и сервером? В частности, включение повторного использования кода для кода в зависимости от $http, $q и других сервисов AngularJS, включенных в структуру angular и angular -third сторон (например, angular-cache).

4b9b3361

Ответ 1

Использование angular в среде без браузера

Ben Clinkinbeard подготовил дистрибутив angular как модуль commonJS (ЗДЕСЬ), который может работать в среде без браузера:

AngularJS скомпилирован с jsdom и представлен как модуль CommonJS. Предназначен для тестирования кода AngularJS, не зависящего от браузера.


Если вы хотите быть более вишневым, вам, вероятно, стоит подождать angular 2.0

Обмен кодом между клиентской стороной и сервером

И снова... Бен Клинкинбород. В THIS TALK он описывает, как использовать браузеру в проекте angular. Одной из замечательных особенностей этого подхода является то, что вы можете объявлять свои функции/объекты как отдельные объекты, которые в любом случае не связаны с 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;

Ответ 2

Используя 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));

Отметьте это Видео для хорошего примера того, как это реализовать, также есть репозиторий из этого видео.

Ответ 3

Angular 1.x - довольно самостоятельная среда. Существует план по разрыву функциональных возможностей, но это будет сделано в версии 2. Таким образом, это было бы просто, как просто обеспечить различную реализацию $httpBackend для браузера и node.js.

Я создал простую демонстрацию общий код между node.js и браузером с помощью CommonJS. Это можно использовать для совместного использования валидации, моделей и т.д.