【问题标题】:Webpack and global scope pollutionWebpack 和全局范围污染
【发布时间】:2018-03-15 15:07:41
【问题描述】:

我正在关注Webpack guide。我像这样导入lodash

import _ from 'lodash';

它按预期工作,但有一些不清楚的地方。 Guide 声称在这种情况下,全局范围不会受到 lodash 的影响,但事实并非如此。

在此设置中,index.js 明确要求 lodash 存在,并将其绑定为 _ (无全局范围污染)。通过说明模块需要哪些依赖项,webpack 可以使用这些信息来构建依赖关系图。然后它使用该图生成一个优化的包,其中脚本将以正确的顺序执行。

在 Chrome 的控制台中我仍然可以访问 lodash:

console.log(_, _.join, window._.join);

所有这些工作,所以很明显 lodash 实际上污染了全局范围。

是因为 lodash 确实明确地将自己分配给 window 还是其他原因?

【问题讨论】:

  • 要么你将它分配给窗口,要么 lodash 做到了。这可能取决于您如何捆绑代码。我不了解 lodash 的内部结构,但是如果它可以识别模块加载机制,很多库会尝试避免附加到全局范围。如果不能,它将自己附加到全局范围。
  • 我认为 lodash 做到了。例如,如果我这样做import Lodash from 'lodash';Lodash 不在全局范围内,而_ 仍然在。我想知道他们为什么使用如此不幸的例子。
  • 我同意。出于同样的原因,我感到困惑

标签: javascript webpack lodash


【解决方案1】:

查看 lodash v4.17.5 源代码,很明显 lodash 正在将 _ 添加到全局范围。

/*--------------------------------------------------------------------------*/

  // Export lodash.
  var _ = runInContext();

  // Some AMD build optimizers, like r.js, check for condition patterns like:
  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
    // Expose Lodash on the global object to prevent errors when Lodash is
    // loaded by a script tag in the presence of an AMD loader.
    // See http://requirejs.org/docs/errors.html#mismatch for more details.
    // Use `_.noConflict` to remove Lodash from the global object.
    root._ = _;

    // Define as an anonymous module so, through path mapping, it can be
    // referenced as the "underscore" module.
    define(function() {
      return _;
    });
  }
  // Check for `exports` after `define` in case a build optimizer adds it.
  else if (freeModule) {
    // Export for Node.js.
    (freeModule.exports = _)._ = _;
    // Export for CommonJS support.
    freeExports._ = _;
  }
  else {
    // Export to the global object.
    root._ = _;
  }
}.call(this));

话虽如此,您似乎可以使用_.noConflict() 从全局范围中删除_

【讨论】:

  • 非常感谢!我当时的直觉是对的。我是 Webpack 的新手,我喜欢导入/导出的想法。我很惊讶他们用 lodash 作为新手的例子,这太令人困惑了!
猜你喜欢
  • 2021-01-12
  • 2021-10-04
  • 2014-04-09
  • 2018-08-30
  • 2018-11-29
  • 1970-01-01
  • 2021-04-17
  • 2014-04-25
  • 2023-03-11
相关资源
最近更新 更多