在browserify中将窗口传递给此窗口

时间:2013-12-22 00:03:53

标签: javascript node.js this browserify

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

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

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

2 个答案:

答案 0 :(得分:3)

wrote a browserify transform called "moduleify"通常应该做你想要的,即将违规代码包装在看起来像这样的IIFE中:

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

事实上,my implementation并不比那更复杂。

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

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

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

答案 1 :(得分:0)

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

的CoffeeScript

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