4

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

两个这样的示例库是:

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

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

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

当我通过 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 运行优化器时,它会构建我的输出文件。在Main-built.js文件中,插件的代码将位于所需库之前。这会导致L undefined error.

如何让优化器尊重我的垫片的依赖顺序,以便在我的优化 JS 文件中正确排序库文件?

4

1 回答 1

1

前段时间我遇到了类似的问题,使用淘汰赛扩展并且垫片无法正常工作。这就是我们解决它的方法。

创建一个名为:leafletLib 的模块

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

    return leaflet;
});

LeafletLib 具有主库和所有扩展。在将传单或传单-dvf 作为依赖项的模块上,您调用leafletLib。这有点hacky,但它可能对你有用。

define(["leafletLib"],function(leafletLib){});
于 2016-04-06T21:37:06.700 回答