在尝试评估不应该评估的插件时,r.js构建失败

时间:2017-11-22 19:04:25

标签: javascript node.js requirejs amd r.js

我有一个名为MapLoader的AMD插件。

导入samples/template/MapLoader!时,会返回模块luciad/view/Map或模块luciad/view/WebGLMap,具体取决于网址查询参数" webgl"。

这是插件的代码:

define({
  load: function(na, require, onload, config) {
    if (window.location.search.indexOf('webgl') > 0 && 
        window.location.search.indexOf('webgl=false' < 0)) {
      map = "luciad/view/WebGLMap";
    } else {
      map = "luciad/view/Map";
    }

    require([map], function(value) {
      onload(value);
    });
  }
});

现在,我尝试使用r.js打包我的项目,但它不知道如何处理这个模块,因为它试图评估代码。因此,它会产生以下错误:

{ Error: ReferenceError: window is not defined
In module tree:
    samples/balloons/main
      samples/template/sample
        samples/template/MapLoader
  ...
}

我当前的配置如下所示:

require('requirejs').optimize({
  baseUrl : moveFrom,
  modules: [
    { name: "./samples/template/MapLoader" }, 
    { name: "./samples/balloons/main" }
  ],
  packages: [
    { name: "loader", location: "./samples/lib/requirejs" },
    { name: "luciad", location: "./luciad" },
    { name: "samples", location: "./samples" }
  ],
  paths: {
    jquery: "./samples/lib/jquery/jquery-1.12.4"
  },
  dir : moveTo,
  stubModules: ['./samples/template/MapLoader'],
  optimize : "none",
  uglify2 : {
    output: {
      beautify: false
    },
    compress: {},
    warnings: true,
    mangle: true
  }
}, function (buildResponse) {
  console.log(buildResponse);
});

我错过了什么?

将此插件添加到构建中的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

James Burke的RequireJS作者this Github issue的帮助下,我提出了以下解决方案:

define({
  load: function(na, require, onload, config) {
    var WebGLMap = "luciad/view/WebGLMap";
    var RegularMap = "luciad/view/Map";
    // Require both maps when running the loader in r.js
    // The parameter passed to "onload" is not important here
    if (typeof window === 'undefined') {
      return require([WebGLMap, RegularMap], function() {
        onload();
      });
    }

    if (window.location.search.indexOf('webgl') > 0 && 
        window.location.search.indexOf('webgl=false' < 0)) {
      map = WebGLMap;
    } else {
      map = RegularMap;
    }
    require([map], function(value) {
      onload(value);
    });
  }
});

typeof window === 'undefined'时,代码将假定r.js用于执行代码,并且将需要两个模块而不是一个模块,正确打包WebGLMapMap模块。