8

我的依赖项之一使用以下内容将窗口传递给它的关闭

(function (window) {
   //
})(this)

暂时我可以把它改成更合理的东西,这样它就不会破坏浏览器化,但是有没有一些方法可以this在浏览器化模块中强制一个值?

4

2 回答 2

3

写了一个名为“moduleify”的browserify转换,它通常应该做你想要的,即将有问题的代码包装在一个看起来有点像这样的IIFE中:

(function () {
// this === window
}.call(window));

事实上,我的实现并不比这复杂多少。

最初的想法是导出一个污染全局的“模块”,就好像它是一个 CommonJS 模块(例如,有 AngularJS 导出window.angular),但是因为它包含那个包装器,所以它应该可以解决问题。

有关说明,请参阅自述文件。如果有问题的脚本实际上没有任何可以合理导出的内容,只需将其导出window(这将导致module.exports = window['window'])或不存在的任意名称(导致undefined)。

如果您想window在自己的 browserify 代码中访问该对象,还请查看global模块,它提供了一个很好的包装器,可以在 CommonJS 模块中安全地访问浏览器全局变量。

于 2014-10-27T19:58:44.063 回答
0

为了解决这个特定的问题,一个简单的转换,将代码包装在一个自调用函数中,就可以完成这项工作。

咖啡脚本

through = require('through')

fenestrate = (file) ->
  data = ';(function() {\n';

  write = (buf) ->
    data += buf

  end = ->
    data += '\n}).call(window);'
    this.queue(data)
    this.queue(null)
  through(write, end)

JavaScript

var through = require('through');

var fenestrate = function(file) {
  var data, end, write;
  data = ';(function() {\n';
  write = function(buf) {
    return data += buf;
  };
  end = function() {
    data += '\n}).call(window);';
    this.queue(data);
    return this.queue(null);
  };
  return through(write, end);
};

编写转换:https ://github.com/substack/browserify-handbook#transforms

于 2015-04-15T19:44:04.990 回答