Javascript 什么';将一些有用的js库包装到angular模块是一种好的做法吗?

Javascript 什么';将一些有用的js库包装到angular模块是一种好的做法吗?,javascript,angularjs,Javascript,Angularjs,我想在angularjs中使用一些有用的库,例如jquery、下划线、下划线.string 在angular代码(比如控制器、指令)中直接使用它们可能不是一个好主意,因为很难进行模拟和测试。所以我想把它们包装成角模: AngularUnderline.js define(['angular', 'underscore'], function(ng, _) { return ng.module('3rd-libraries') .service('underscoreService',

我想在angularjs中使用一些有用的库,例如jquery、下划线、下划线.string

在angular代码(比如控制器、指令)中直接使用它们可能不是一个好主意,因为很难进行模拟和测试。所以我想把它们包装成角模:

AngularUnderline.js

define(['angular', 'underscore'], function(ng, _) {
  return ng.module('3rd-libraries')
    .service('underscoreService', function() {
      return _;
    });
});
我的问题是:

  • 使用
    .service()
    定义
    服务
    好吗?还是一个工厂或常数更好
  • 使用
    下划线服务好吗
    ,还是只使用
    下划线
    就足够了

  • 我认为这确实是一个范围问题。
    尽管有些人不同意,但我认为加载下划线作为每个测试套件的依赖项是很好的。原因是我的经验法则说,任何“静态”操作——也就是说——使用的任何非应用程序逻辑或数据敏感的通用算法,都应该单独测试(或者在类似于_underscope的框架中根本不测试)。
    这使得测试更易于编写、可读性和可维护性更强,并且抛开少数情况不谈,如果在排序数组时出现新的错误,这些测试可能会失败。此外,我看不到你从这些算法的DI中获益(除了我之前提到的嘲笑)

    然而,如果一个算法更复杂,并且涉及到数据逻辑依赖性,我肯定会引入一个工厂(或者一个服务,两者都是单例的),只是为了封装这个逻辑并使其自身可测试。
    至于服务vs工厂(vs供应商),可能有很多答案,我个人喜欢:

    一个非常固执己见的问题。只是我的喜好:1。服务,2。我总是把它们放在工厂里。下划线(或者更好的名称:lodash)我总是将其视为一个小例外,因为它基本上是一个实用程序库。我从不需要以任何方式嘲笑它,而且我在测试中实际使用了它。。。