首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Webpack和外部自由贸易组织: ProvidePlugin与入口对全球进口?

Webpack和外部自由贸易组织: ProvidePlugin与入口对全球进口?
EN

Stack Overflow用户
提问于 2016-10-06 05:48:37
回答 2查看 10K关注 0票数 26

1. ProvidePlugin()

看起来是一种常用的方法。有一个关于它的要旨,展示了如何在Webpack构建中包含whatwg fetch多边形填充。StackOverflow上的许多答案都使用它、这里这里

代码语言:javascript
复制
new webpack.ProvidePlugin({
  '$': 'jquery',
  'jQuery': 'jquery',
  'fetch': 'imports?this=>global!exports?global.fetch!whatwg-fetch'
})

优点

  • 它起作用了。(如果我遗漏了什么,请更新此列表)

缺点

  • 需要跟踪Webpack配置中的全球库。

2. entry: [...]

当我在这个要旨中发现这种方法时,我对它感到有点惊讶,但它同样有效。

代码语言:javascript
复制
entry: [
    'babel-polyfill',
    'whatwg-fetch',
    'jquery',
    'webpack-hot-middleware/client',
    path.join(process.cwd(), 'app/app.js')
],

优点

  • 它起作用了。
  • 我可以完全放弃ProvidePlugin()

缺点

  • 需要跟踪Webpack配置中的全球库。

3.顶级import

这个例子非常简单,参见这个app.js示例。此文件是React应用程序的入口点.

代码语言:javascript
复制
/**
 * app.js
 */

import 'whatwg-fetch';
import 'babel-polyfill';
import 'jquery';

优点

  • 效果也一样好。
  • 容易添加/删除。不用碰Webpack的配置。

缺点

  • 看起来,这种方法并不能单独用于jQuery插件,例如bootstrap.js。

Observation:在这三种方法之间,我没有注意到包大小的任何变化。

有没有一种与Webpack一起处理全球库的推荐方法(并作出反应)?这些解决方案中的任何一个会导致服务器端呈现的问题吗?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-10-06 08:38:28

我不建议将库公开为全局库,除非您确实需要它,例如,模块系统的要点是显式声明依赖项。

代码语言:javascript
复制
// app.js
import $ from 'jquery';
$.ajax(...);

如果您在全局上确实需要jQuery,因为第三方脚本需要它在您的页面上或者在控制台中进行调试,那么下面是关于您列出的方法的一些信息:

ProvidePlugin

ProvidePlugin不会在全局上公开jQuery,而实际上是为了修复不正确地依赖全局模块的第三方模块,所以我不推荐这样做。

代码语言:javascript
复制
// app.js
$.ajax(...);

有效地转移到:

代码语言:javascript
复制
// app.js
require('jquery').ajax(...);

入口及顶级进口

这些方法不适用于常规UMD模块(如jQuery ),因为jQuery很聪明,在由公共as / amd / es6感知加载程序加载时不会在全局上暴露自己。

然而,这两种方法对于具有副作用的模块(如babel-polyfill / whatwg-fetch )来说是理想的,因为它们不导出任何东西,它们本身就会改变全局环境。

因此,我对jQuery的建议是使用expose-loader,该expose-loader旨在向全球公开一个模块导出。

代码语言:javascript
复制
// webpack.config.js
{
    module: {
        loaders: [
            test: require.resolve('jquery'),
            loader: 'expose-loader?jQuery!expose-loader?$'
        ]
    }
}

然后,您仍然需要在应用程序代码中导入它:

代码语言:javascript
复制
// app.js
import $ from 'jquery';
$.ajax(...)

但是,如果绝对必要的话,该页面上的其他脚本可以在全局上访问:

代码语言:javascript
复制
// console
window.$
window.jQuery

注意:从技术上讲,当使用公开加载程序时,您可以在入口点上只使用一次import 'jquery',然后在其他模块中依赖全局。

然而,正如我所说的,如果您不需要公开一个模块,即使您目前正在其他模块中使用它,也不建议公开它。

票数 25
EN

Stack Overflow用户

发布于 2019-09-17 14:33:26

如果在使用ProvidePlugin时在一个页面中包含了几个包(入口点),只需发现提供的lib将被覆盖。例如RoR和Webpacker,但我认为这并不重要。

例如,您的布局中有:

代码语言:javascript
复制
  javascript_pack_tag 'application',
                      'metronic'

在倾诉中,你有:

代码语言:javascript
复制
  environment.plugins.append('Provide', new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery',
      "window.jQuery": "jquery",
      "window.$": "jquery",
      _: 'underscore',
      Handlebars: 'handlebars'
  }));

如果在application.js中需要改变JQuery的库,那么您将在metronic.js和浏览器中释放所有这些变异,即使您使用公开加载器公开JQuery。

如果我错了,也许ProvidePlugin只是在每个入口点导入库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39888395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档