Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 网页包和外部库:ProvidePlugin vs entry vs global import? 1. ProvidePlugin()_Javascript_Reactjs_Ecmascript 6_Webpack - Fatal编程技术网

Javascript 网页包和外部库:ProvidePlugin vs entry vs global import? 1. ProvidePlugin()

Javascript 网页包和外部库:ProvidePlugin vs entry vs global import? 1. ProvidePlugin(),javascript,reactjs,ecmascript-6,webpack,Javascript,Reactjs,Ecmascript 6,Webpack,看起来是一种常用的方法。有一个关于它的例子,展示了如何将whatwg fetchpolyfill包含到一个网页包构建中。关于StackOverflow的很多答案都使用它 我不建议将库公开为全局库,除非您确实需要它,即模块系统的要点是显式声明依赖项,例如 // app.js import $ from 'jquery'; $.ajax(...); 如果您确实需要全局查询,因为第三方脚本需要在您的页面上使用jQuery,或者可能需要在控制台中进行调试,那么以下是有关您列出的方法的一些信息: Pro

看起来是一种常用的方法。有一个关于它的例子,展示了如何将whatwg fetchpolyfill包含到一个网页包构建中。关于StackOverflow的很多答案都使用它


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

// app.js
import $ from 'jquery';
$.ajax(...);
如果您确实需要全局查询,因为第三方脚本需要在您的页面上使用jQuery,或者可能需要在控制台中进行调试,那么以下是有关您列出的方法的一些信息:

ProvidePlugin

ProvidePlugin不会在全局上公开jQuery,它的真正目的是修复错误地依赖全局模块存在的第三方模块,因此我不建议这样做,例如

// app.js
$.ajax(...);
有效地传输到:

// app.js
require('jquery').ajax(...);
入门级和顶级导入

这些方法不适用于像jQuery这样的常规UMD模块,因为当jQuery被一个支持commonjs/amd/es6的加载程序加载时,它足够聪明,不会在全局上暴露自己

然而,这两种方法对于具有副作用的模块非常理想,例如
babel polyfill
/
whatwg fetch
,因为它们不输出任何东西,它们固有地改变了全球环境


因此,我建议使用jQuery,它旨在全局公开模块导出,例如

// webpack.config.js
{
    module: {
        loaders: [
            test: require.resolve('jquery'),
            loader: 'expose-loader?jQuery!expose-loader?$'
        ]
    }
}
然后,您仍然需要将其导入应用程序代码:

// app.js
import $ from 'jquery';
$.ajax(...)
但是,如果绝对必要,可以在全局上访问该页面上的其他脚本:

// console
window.$
window.jQuery
注意:从技术上讲,在使用expose loader时,您可以在入口点导入一次“jquery”,然后在其他模块中依赖全局查询


但是,正如我所说的,如果您不需要公开模块,即使您目前碰巧在其他每个模块中使用该模块,也不建议公开该模块。

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

例如,您的布局中有:

  javascript_pack_tag 'application',
                      'metronic'
在配置中,您有:

  environment.plugins.append('Provide', new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery',
      "window.jQuery": "jquery",
      "window.$": "jquery",
      _: 'underscore',
      Handlebars: 'handlebars'
  }));
如果在
application.js
中需要库,这些库会使JQuery发生变异,那么在
metronic.js
和浏览器中,即使您使用expose loader公开JQuery,也会丢失所有这些变异


如果我错了,请纠正我,可能ProvidePlugin只是在每个入口点导入LIB。

entry
如果您有多个入口点,这根本不是一个好主意。
  environment.plugins.append('Provide', new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery',
      "window.jQuery": "jquery",
      "window.$": "jquery",
      _: 'underscore',
      Handlebars: 'handlebars'
  }));