我有一个遗留应用程序,我已将应用程序的部分重构为单独的骨干.marionette 应用程序。我没有时间或预算来重构整个事情,我希望我的代码更容易管理,这让我想到了 requirejs。
大多数文件都被缩小并合并在一起。
我可以将 requirejs 用于这种类型的混合解决方案,我可以在单独的主干模块上工作并且仍然可以访问现有的 javascript?
我有一个遗留应用程序,我已将应用程序的部分重构为单独的骨干.marionette 应用程序。我没有时间或预算来重构整个事情,我希望我的代码更容易管理,这让我想到了 requirejs。
大多数文件都被缩小并合并在一起。
我可以将 requirejs 用于这种类型的混合解决方案,我可以在单独的主干模块上工作并且仍然可以访问现有的 javascript?
作为一个刚刚开始在遗留的、使用 Backbone 的代码库上使用 Require.js 的人,我感受到了你的痛苦 :-) 我使用了多种方法,我将在此处列出。
假设您有 fileA.js 和 fileB.js,并且您想将 fileB.js 转换为使用 Require,而不更改 fileA.js:
滥用全球空间
Require 不会强制您通过它导入每个变量;即使在 Require-ified 文件中,您仍然可以像使用非 Require-ified 代码一样访问全局变量。这意味着如果 fileA 在 global/window 命名空间中创建它的所有变量(如果您之前没有使用过 Require,这很有可能),无论 fileA 是否使用 Require,fileB 都可以访问它们。
这最终成为我大部分遗留文件的解决方案;我只是让它们保持原样,并将所有新的 Require-ified 东西放在它们下面。这样,他们创建的每个全局都准备好并在 Require-ified 文件需要它们时等待。
现在,如果 fileB 依赖于 fileA 这很好,但如果反过来呢?好吧,Require 也不会阻止你创建新的全局变量,这意味着 fileB 可以与 fileA 共享它想要的任何东西,只要它愿意将它放在全局空间中。
重复代码
不要生气;我知道“DRY”编码实践的重要性。然而,对于几个文件,我最终做的是制作 Require-ified 副本。这最终是必要的,因为我使用 Handlebars 插件进行 Require 进行模板编译,所以如果我想要任何文件使用 Handlebars,我需要它是 Require-ified。
为了解决正常的 un-DRY 问题,我在旧文件中添加了注释,有效地说“不要在这个文件中添加任何东西,Require-ified 版本是'真实'版本”。我的计划是随着时间的推移慢慢将更多的站点转换为 Require,直到我最终可以消除原始的、过时的文件。我们有一家小商店,所以它对我们有用,但在一家大公司,这可能行不通。
重构
我知道,你说过你想避免这种情况,但有时一点重构可以让你物超所值。我个人几乎没有重构任何东西,但只有几个地方是一个小小的调整,大大简化了事情。
总体而言,我认为重构是您在切换到 Require 后所做的事情(随着时间的推移,将您的非 Require-ified 代码“加入”)。
垫片
Chchrist 说 shims 是解决“中途 Require”问题的好方法是正确的。但是,我个人根本没有使用它们,所以除了“看看他们”,我真的不能说太多,他们可能会有所帮助”。