RequireJS:开发环境中的命名空间,以避免与其他AMD lib发生冲突

时间:2016-11-02 16:56:00

标签: javascript requirejs

我正在处理的项目使用requireJS。效果很好,当我们想要构建它时,我们使用:

({
  // ..
  namespace: 'projectCodeName',
  // ..
});

但我有时需要加载另一个也使用requireJS的库,但不会将其命名为:()。

我制作,我没有任何问题,因为requirejs可以访问我自己的window.projectCodeName.require()

但是在开发中,没有任何工作符合预期。

我发现我可以构建requireJS without uglyfying,但是遗憾的是,丢失文件匹配,行号等是很可惜的。

我可以在开发模式下使用requireJS和命名空间。类似的东西:

<script data-namespace="projectCodeName" src="bower_components/requirejs/require.js"></script>

干杯

编辑:

我尝试手动执行此操作:

window.projectCodeName = window.projectCodeName || {};
window.projectCodeName.require = window.require;
window.projectCodeName.requirejs = window.requirejs;
window.projectCodeName.define = window.define;
delete require;
delete requirejs;
delete define;

不幸的是后者delete require不起作用,它返回false,这意味着这是non-configurable property

我认为requirejs非常擅长避免全局命名空间问题,但它却不断带来麻烦。这真令人讨厌和失望。

1 个答案:

答案 0 :(得分:0)

multiversion support in requirejs,因此您可以为每个项目设置上下文。这是doc页面中的一个示例。这是你想要的吗?

var reqOne = require.config({
  context: "version1",
  baseUrl: "version1"
});

reqOne(["require", "alpha", "beta",],
function(require,   alpha,   beta) {
  log("alpha version is: " + alpha.version); //prints 1
  log("beta version is: " + beta.version); //prints 1

  setTimeout(function() {
    require(["omega"],
      function(omega) {
        log("version1 omega loaded with version: " +
             omega.version); //prints 1
      }
    );
  }, 100);
});

var reqTwo = require.config({
  context: "version2",
  baseUrl: "version2"
});

reqTwo(["require", "alpha", "beta"],
    function(require,   alpha,   beta) {
  log("alpha version is: " + alpha.version); //prints 2
  log("beta version is: " + beta.version); //prints 2

  setTimeout(function() {
    require(["omega"],
      function(omega) {
        log("version2 omega loaded with version: " +
        omega.version); //prints 2
      }
    );
  }, 100);
});