Require.js Optimizer错误地订购了填充程序依赖项

时间:2014-07-10 17:34:46

标签: requirejs r.js requirejs-optimizer

我有一个使用Require的Web应用程序,以便加载依赖项。我有一组使用Require config.shim对象包含的JS库。

两个这样的示例库是:

require.config({
  shim: {
    "libs/leaflet": {
        exports: "L"
    }  
    "libs/leaflet-dvf": {
        deps: ["libs/leaflet"],
        exports: "L"
    }
}

第二个库leaflet-dvf需要第一个库leaflet。第二个是第一个插件,它依赖于第一个库定义的全局范围变量L

当我使用Require正常运行应用程序时,一切正常。我可以包括垫片中的任何一个库,一切都很好。没问题。

当我通过Require r.js Optimizer运行此代码时出现问题。优化器在构建单个优化的JS文件时,将错误地对依赖项进行排序。在构建文件中,leaflet-dvf代码将出现在leaflet代码之前。这会导致JS运行时错误,因为依赖插件无法找到所需的L全局范围变量。

我的构建配置如下:

({
  baseUrl: "../js",
  paths: {
    "requireLib": "../js/libs/require"
  },
  include: ["requireLib"],
  name: "Main",
  out: "bin/Main-built.js",
  optimize: "none",
  wrapShim: true
})

当我使用Rhino运行Optimizer时,它会构建我的输出文件。在Main-built.js文件中,插件的代码将位于所需的库之前。这会导致L undefined error

如何让Optimizer尊重我的Shims的依赖顺序,以便在我的Optimized JS文件中正确排序库文件?

1 个答案:

答案 0 :(得分:1)

我有一个类似的问题,一段时间回来与淘汰赛扩展和垫片没有正常工作。这就是我们解决它的方式。

创建一个名为:leafletLib

的模块
define(["libs/leaflet","libs/leadleft-dvf"],function(leftlet,dvf){

    return leaflet;
});

LeafletLib有主库和所有扩展。在将leaflet或leaflet-dvf作为依赖项的模块上,调用leafletLib。它有点hacky但它​​可能适合你。

define(["leafletLib"],function(leafletLib){});