Как повторно использовать код между клиентом 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
).
Ответы
Ответ 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. Это можно использовать для совместного использования валидации, моделей и т.д.