代码之家  ›  专栏  ›  技术社区  ›  Carlo

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

  •  1
  • Carlo  · 技术社区  · 7 年前

    我正在Codeigniter项目中使用Webpack4。我的许多Javascript代码仍然依赖于jQuery(通过npm安装),因此我有以下网页配置:

    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,我得到一个错误,它没有定义

    2 回复  |  直到 7 年前
        1
  •  1
  •   Dimitris Karagiannis    7 年前

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

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

    但是,由于您现在正在删除 ProvidePlugin dropzone插件从未成功连接自身,因此没有 $()。dropzone公司 方法可用,因此您会得到该错误

    长话短说,只要您依赖于假定jQuery加载在全局范围内的外部代码,就无法真正消除 webpack.ProvidePlugin ,除非您直接修改这些依赖项的源代码。

        2
  •  1
  •   Cody Geisler    7 年前

    尝试使用

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