2016-04-21 89 views
2

JavaScript代码模块化(通过示例进行浏览)和依赖注入有什么区别?JavaScript模块化和依赖注入之间的区别

它们是同义词吗?这两个人在一起吗?或者我错过了一些观点?

+0

你看过https://en.wikipedia.org/wiki/Module_(disambiguation)#Computing_and_engineering和https://en.wikipedia.org/wiki/Dependency_injection吗? – Bergi

回答

1

模块化是指将代码分解为独立的“包”。
依赖注入是指不对其他模块的引用进行硬编码。

作为一个实际的例子,你可以写一个不使用依赖注入模块:

import { Foo } from 'foo'; 

export function Bar() { 
    return Foo.baz(); 
} 

在这里,你有两个模块,但这个模块导入特定的其他硬编码模块。

使用依赖注入编写的同一模块:

export function Bar(foo) { 
    return foo.baz(); 
} 

然后其他人可以以此为:

import { Foo } from 'foo'; 
import { Bar } from 'bar'; 

Bar(Foo()); 

注入Foo依赖的通话时间,而不是硬编码的依赖。

1

您可以参考此article

模块是实现某些功能和 通过使用特定技术编写的代码片段。 JavaScript语言中没有现成的模块化方案 。即将推出的 ECMAScript 6规范倾向于通过在JavaScript语言本身中引入 模块概念来解决此问题。这是未来。

Dependency injection in JavaScript

目标

比方说,我们有两个模块。第一个是 发出Ajax请求的服务,第二个是路由器。

var service = function() { 
    return { name: 'Service' }; 
} 
var router = function() { 
    return { name: 'Router' }; 
} 

我们有另一个需要这些模块的功能。

var doSomething = function(other) { 
    var s = service(); 
    var r = router(); 
}; 

而且使事情变得更有趣 需要接受一个参数的函数。当然,我们可以使用上面的代码, 但这不是很灵活。如果我们想要使用ServiceXML或ServiceJSON,该怎么办?或者如果我们想要模拟一些 测试目的的模块。我们不能只编辑函数的主体。 我们都想出的第一件事就是将依赖关系作为 参数传递给函数。即:

var doSomething = function(service, router, other) { 
    var s = service(); 
    var r = router(); 
}; 

通过这样做,我们传递我们想要的模块 的具体实现。然而这带来了一个新问题。想象一下,如果我们有 doSomething遍布我们的代码。如果我们需要第三个 依赖项会发生什么。我们不能编辑所有函数的调用。所以,我们需要一个 仪器,这将为我们做到这一点。这就是依赖注入器 正试图解决。让我们写下我们要 实现几个目标:

  • ,我们应该能寄存器相关
  • 注射器应该接受一个函数,应该返回一个函数,它以某种方式获得所需的资源
  • 我们应该不要写很多,我们需要简短而好语法
  • 注入器应该保持传递函数的作用域
  • 传递的函数应该能够接受自定义参数,不仅仅是描述的依赖关系

一个不错的清单是不是。让我们潜入。