将RequireJS与遗留代码一起使用

时间:2013-01-29 16:41:07

标签: javascript backbone.js requirejs legacy

我正在使用一个非常大的项目:

  1. 包含带脚本标记的javascript文件的旧版JSP页面
  2. 使用其他没有RequireJS的
  3. 的javascript模块的骨干模型和视图

    我们现在想开始将RequireJS与jQuery,BackboneJS和UnderscoreJS一起用于我们从现在开发的所有内容,但是我们没有资源来重写所有遗留的JSP页面。我们可能有时间重写我们已经开发的Backbone模型和视图。

    问题在于,对于我们的遗留代码(上面的1和2),我们将所有javascript文件包含在一个巨大的文件中并发送到浏览器。这个庞大的文件必须能够与我们新的RequireJS模板共存,但我怎样才能将巨大文件的某些部分分开,以便我可以使用RequireJS将它们与模板一起使用?无需重写使用该部分文件或具有重复代码的所有页面。

    谢谢!

2 个答案:

答案 0 :(得分:4)

我不知道我是否完全掌握了手头的问题,但我认为RequireJS的shimmap功能会帮助你。

从巨大的javascript文件中提取新模块中所需的部分。然后告诉RequireJS你的巨大的javascript文件是使用shim这个新模块的依赖。类似的东西:

requirejs.config({
    shim: {
        'new-module': {
            deps: ['huge-javascript-file'],
            exports: 'NewModule'
    }
});

Shim文档:http://requirejs.org/docs/api.html#config-shim

当只有部分新代码必须使用旧的大文件时,map函数可能会很有用。查看此文档:http://requirejs.org/docs/api.html#config-map

答案 1 :(得分:1)

我认为没有一种真正的方法可以实现这一目标,但我通过在全局范围的代码周围定义模块“外观”来解决类似的问题。假设您的遗留脚本定义了一个名为foo的全局变量。您可以定义AMD模块并从中导出该变量:

//foo.js
define(function() {
  return window.foo;
});

//bar.js
define(['foo'], function(foo) {
  //do something with foo
});

这样,每次需要使用现有的全局定义代码时,您只需要编写单行外观,而不会破坏需要全局定义相同代码的现有代码。随着时间的推移,您可以将实际实现移动并重构到模块中,而不会破坏消费者代码。