当 .call(this) 来自 commonJS 模块时,如何使它成为 window

How do I make this window when .call(this) from a commonJS module

我正在使用 Webpack 打包我的依赖项我正在尝试加载方法组合器。依赖关系看起来像这样...

// Generated by CoffeeScript 1.3.1
(function() {
  var __slice = [].slice;

  this.before = function(decoration) {
    return function(base) {
      return function() {
        decoration.apply(this, arguments);
        return base.apply(this, arguments);
      };
    };
  };
  ...
}).call(this);

然后我在我的 TS 文件中包含...

require("method-combinators/lib/method-combinators.js");

当我在内部函数上设置断点时,我注意到 this != window。如果我尝试添加...

require.bind(window);

我明白了

Critical dependencies: 20:0-7 require function is used in a way in which dependencies cannot be statically extracted

正确的做法是什么?

更新

> this
Object {}
> window
Window {...}

如果我这样做

window['comb'] = require("method-combinators/lib/method-combinators.js");

它似乎有效,但因为这是遗留代码,所以很难搜索 after 和 begin 的所有实例。

更新 2

这有点管用...

var comb = require("method-combinators/lib/method-combinators.js");
window['after'] = comb.after;
window['before'] = comb.before;

这与@tcooc 提供的答案类似,但问题是我必须列出每个函数。对于下划线,我有这样的东西...

var s = require("underscore.string");
window['_'].mixin(s.exports());

但是这里的问题是梳子没有exports

更新 3

这是我的决赛

var comb = require("method-combinators/lib/method-combinators.js");
window['_'].extend(window, comb);

commonjs 模块,按照设计,不访问或修改全局范围(或​​者至少不应该)。您代码中的 this 变量引用的是从该模块导出的值,而不是 window。该代码实际上包装在类似的东西中(针对您的用例进行了简化):

// you want to load "method-combinator.js"
require('method-combinator.js');
// load "method-combinator.js" as "dependency()"
var exports = {};
dependency.call(exports);

现在,每当您尝试加载 "method-combinator.js" 时,都会返回 exports

依赖的正确使用方法是:

var combinators = require('method-combinator.js');

如果您希望将 combinators 的所有值添加到 window,假设您有下划线:

_.extend(window, combinators);
// or if _ is somehow not resolving properly (for some reason?)
window._.extend(window, combinators);