如何仅在 Webpack 4 的某些模块中导入 jQuery?

How to import jQuery only in certain modules with Webpack 4?

我在 Codeigniter 项目中使用 Webpack 4。我的很多 Javascript 代码仍然依赖于 jQuery(通过 npm 安装),所以我有这个 Webpack 配置:

plugins: [
    new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery',
      'window.jQuery': 'jquery',
}),

它有效,但我打算放弃 jQuery,或者至少减少对它的依赖,所以我不想在全球范围内导入它,而是只在需要它的模块中导入它. 我尝试删除上面的配置并将其添加到模块中:

import { $, jQuery } from 'jquery';
import Dropzone from 'dropzone';

加载页面时,我在控制台中收到此错误:

myDropzone.js:95 Uncaught TypeError: Object(...) is not a function
at Object.<anonymous> (myDropzone.js:95)
at r (bootstrap:76)
at t (bootstrap:43)
at bootstrap:134
at bootstrap:134

导致错误的代码:

$('.dropzone').each(function () {  // <--- this line
  $(this).dropzone(config);
});

在控制台中,我尝试检查 $jQuery,第一个工作正常,但是 jQuery 我收到一条错误消息,指出它未定义

尝试使用

import $ from 'jquery';
window.jQuery = $;
window.$ = $;

好的,我很确定会发生以下情况:

您正在加载 jQuery dropzone 插件,该插件位于依赖关系树的某个较高位置,可能由其他包加载。该插件希望在全局范围内找到 jQuery 对象,以便将其自身附加到它(因此可以让您访问 $().dropzone 方法,请参阅 here )。通过在 dropzone 插件尝试将自身附加到 jQuery 对象时使用 ProvidePlugin,没有问题

但是,由于您现在要删除 ProvidePlugin,dropzone 插件永远无法自行附加,因此没有 $().dropzone 方法可供使用,因此您会收到错误消息

长话短说,只要您依赖于假设 jQuery 已加载到全局范围内的外部代码,您就无法真正消除 webpack.ProvidePlugin 的使用,当然除非您直接修改那些依赖的源码