Compartilhando módulos entre NodeJS e AngularJS

Síntese: https://gist.github.com/sevcsik/9207267

Eles dizem que um dos prós do NodeJS é que você usa a mesma linguagem no back-end e no front-end, então é fácil compartilhar código entre eles. Isso parece ótimo em teoria, mas na prática, o tratamento de dependência síncrona no NodeJS funciona completamente diferente de qualquer framework do lado do cliente (que é assíncrono).

Normalmente isso significa que você acaba copiando e colando seu código entre suas fontes NodeJS e suas fontes do lado do cliente, ou você usa alguma ferramenta como o Browserify , que é brilhante, mas eles adicionam uma etapa extra no processo de construção e provavelmente entrará em conflito com o tratamento de dependência do framework de sua escolha (como AngularJS DI). Eu não poderia me olhar no espelho se chamasse isso de compartilhamento de código.

Felizmente, com algumas linhas de código padrão, você pode escrever um módulo que funcione em NodeJS e AngularJS sem nenhuma modificação. Ainda estou para encontrar uma maneira de documentá-los perfeitamente.

// We will pass these to the wrapper function at the end of the file
(function(isNode, isAngular) {

// This wrapper function returns the contents of your module,
// with dependencies
var SilverBulletModule = function(Bullet, Silver) {
var SilverBullet = function() {
// something awesome happens here
};
return SilverBullet;
};

if (isAngular) {
// AngularJS module definition
angular
.module('app.silverbullet', ['app.silver', 'app.bullet']).
factory
('SilverBullet', ['Bullet', 'Silver', SilverBulletModule]);
} else if (isNode) {
// NodeJS module definition
module
.exports = SilverBulletModule(
require
('bullet.js'),
require
('silver.js')
);
}

})(typeof module !== 'undefined' && module.exports,
typeof angular !== 'undefined');

E é isso. Sem globais no front-end e as dependências funcionarão. Os vars isNode e isAngular estão no encerramento, portanto, podem ser usados ​​para alternar entre blocos de código dependentes da plataforma (como angular.extende node.extend).

Como você precisaria do isAngularbranch e do isNodebranch de qualquer maneira, e também da função wrapper no front-end, há apenas 4 linhas adicionais necessárias para tornar seu módulo compatível com os dois -ends.

A portabilidade para RequireJS deve ser semelhante, pois ambos usam funções de wrapper e dependências como argumentos de função.