繁体   English   中英

角度服务和浏览器化

[英]Angular services and browserify

我正在使用AngularJS作为SPA,我使用browserify来构建我的应用程序。 现在问题是我们是否应该以经典方式编写Angular服务,或者只是require它们。

由于Angular服务是单例,因此也可以通过require轻松完成:只需公开一个对象文字就可以了。 工厂也是可能的,只需公开一个功能。 等等 ...

我目前可以想到的唯一缺点是我无法从这样的文件(例如, $http )访问其他真正的 Angular服务,但是在后台使用browserify这似乎并不那么重要。 例如,由于browserify,您可以轻松地使用Node.js的http模块。

那你觉得怎么样? 这有什么其他优点和缺点?

PS:请注意,我不是要问这是好还是坏,因为这可能主要是主观的。 我很感兴趣哪些机会出现,或者我必须面对哪些风险。

这样做的一个缺点是编写单元测试。 如果您只是要求它们而不是使用Angular的依赖注入,那么很难模拟您的依赖项。

这对我来说有点破坏性,因为使用Angular的许多好处之一是框架的可测试性。

这不好。

只需使用browserify初始加载您需要的所有模块。

  • 你错过了$ httpBackend
  • 你的代码变得更难以遵循,也就是说,很少有人重用那个指令控制器
  • 你错过了$ http拦截器
  • 你错过了它能够修改和与其他注射剂交互。

我在角度应用程序中使用browserify / webpack / requirejs的唯一方法是两件事:

  • 创建js包
  • 将模板作为字符串作为模块注入角度模板缓存中。

就个人而言,这种方法只是一种毫无意义的复杂问题。

如果你需要像$http这样的东西,你将无法在测试过程中注入这些服务的虚拟/模拟。

虽然地方,你会做你的超级骗子的服务之间需要的配线 $http和地方你需要它。

我想到的第一件事就是路线上的左轮手枪。 您甚至可以使用一些辅助方法来处理多次声明相同的依赖项。

想象一下这个模块:

function SuperResource($http, pathExpression) {}

exports.SuperResource = SuperResource;
exports.superResourceFactory = function(pathExpression) {
    return [
        '$http',
        function() {
            return new SuperResource($http, pathExpression);
        }];
};

你会做的地方:

var myModule = require('./myModule.js');

resolvers: {
     usersResource: myModule.superResourceFactory('/users')
}

甚至你可以拥有一个定义用户资源的用户模块:

var myModule = require('./myModule');

exports.userFactory = ['$http', function() {
    return new myModule.SuperResource($http, pathExpression);
}

是的,这些是特定角度的自由代码中的角度特定助手,但至少它们是以自己的方法/名称隔离的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM