Javascript 如何将紧密耦合的代码提取到外部库中?

Javascript 如何将紧密耦合的代码提取到外部库中?,javascript,html,paradigms,Javascript,Html,Paradigms,这是一个关于范例的一般性问题,如果这是一个不适合提问的地方,我很抱歉。请在正确的位置礼貌地提出建议,以便提问:) 我在一家公司工作,该公司的每个网站都有单独的代码库。我被要求从一个代码库中提取一个相当大的功能,并将其放入一个外部库中,以便多个代码库可以使用它 问题是代码与内置的代码库紧密耦合,我很难提取它。我从多个角度处理过这个问题,每次都从头开始。每一次,我都会遇到一些复杂的问题,感觉好像我在以错误的方式处理问题。我想知道是否有其他人有这样做的经验,或者是否有一个推荐的方式继续 以下是我尝试过

这是一个关于范例的一般性问题,如果这是一个不适合提问的地方,我很抱歉。请在正确的位置礼貌地提出建议,以便提问:)

我在一家公司工作,该公司的每个网站都有单独的代码库。我被要求从一个代码库中提取一个相当大的功能,并将其放入一个外部库中,以便多个代码库可以使用它

问题是代码与内置的代码库紧密耦合,我很难提取它。我从多个角度处理过这个问题,每次都从头开始。每一次,我都会遇到一些复杂的问题,感觉好像我在以错误的方式处理问题。我想知道是否有其他人有这样做的经验,或者是否有一个推荐的方式继续

以下是我尝试过的:

  • 我将相关文件复制到一个新项目中,小心地用普通javascript替换对旧代码库的每个引用。这是一个艰难的过程,我不断遇到无法解决的问题

  • 我在旧代码库中放置了一个非常基本的HTML文件,以及一个空白的javascript文件。我一次剪切并粘贴一个函数到javascript文件中,并在旧代码库和基本HTML文件中调用它们

  • 我创建了另一个新项目,并将函数一次复制并粘贴到新项目中


每种方法都给我带来了自己的挑战,但我无法回避这样一个事实,即原始代码与原始代码库紧密耦合,因此进展非常缓慢,我开始怀疑是否有任何代码可以挽救。

旧代码可能无法挽救,如果你回到过去,这样说是非常合理的

在这种情况下,我的典型目标是,几乎所有旧代码都无法出售,但新代码不仅需要接管,而且需要很快被新旧代码库使用,这就是将代码重构为模型、服务和组件(减少MVC,增加“数据,如何获取和更改数据,以及如何查看和交互数据”)

如果您要构建一些东西来复制旧的东西,但要从头开始编写,我会将其视为全新的,首先从接口开始。通过了解外部边缘应该是什么样子,保持内部代码干净,并依靠DI(原则,而不是任何包装器),我构建了我认为我应该能够拥有的系统,这样新项目/产品就可以愉快地与正确的东西集成

…对于那些需要对产品进行改造的项目,在一个破败的旧系统中,我采取了几乎相同的策略;我设计了我想要的界面,我确保一切都是DI友好的(这在这里变得更重要),然后我构建了一个外观,它看起来就像旧的Bustness是如何被调用和使用的,在这个外观内部,我实例化了sane系统,我将旧的、糟糕的数据点转换成我们的新模型,我做我的系统需要做的任何事情,在离开系统的过程中,我将我们令人敬畏的新模型转换成旧体制造成的可怕结果

最新的这类东西是一个承载新API的新平台。 然而,这些API与糟糕的、陈旧的、有状态的、基于会话的web服务对话,这使得横向扩展完全不可能(当您的目标是在节点上、AWS上分发新平台时,这不是您想要听到的)

解决方案是完全按照我们期望的方式构建API;让接口看起来尽可能好,尽可能有用,同时满足API客户机的实际需求

然后,我们确保提供API的模块将DI用于充当旧后端连接器的服务。 这样,当需要连接到更好的系统实现时,我们可以简单地交换该服务。 然而,这种服务需要变压器

它需要一个转换器来将我们令人敬畏的新请求对象转换为不断增长的可怕的旧泥球。 然后它需要另一个转换器将丑陋的旧数据的输出转换成我们整个系统使用的新模型。 这些转换器不一定需要注入到服务中,因为它们的实现细节与它们调用的位置紧密相连,对服务的任何更新,或者调用的任何新服务都需要针对特定服务的实现细节进行转换器工作

此外,前端方面也存在问题,在与服务器交谈时,通信常常被认为是理所当然的

我们现在在客户端有了转换器,在最后一秒(实际上,我们编写了客户端服务)使用它将旧的处理方式转换为新的形式

< P>任何一个在过程中间随机调用的全局数据都被分解成服务、转换和API,如果它服务于特定的/可重用的目的。 所有这些神奇地抓取的信息现在都被显式地传递进来。其中一些是仅限客户端的,因此要么是用于实例化的配置数据,要么是服务上特定方法的参数。 会话数据现在以令牌/ID的形式从客户端显式地传递回每个需要它们的请求(目前)。 因此,新平台保持100%无状态(因此,从这一方面来说,它的扩展性非常好)

只要所有这些神奇的数据都从内部提取出来并传递出去,系统就可以继续进行重构,而不用太担心。 只要系统内部存在状态和状态管理