webpack4导入jQuery的新方案

本文的目的

拒绝全局导入jQuery!!

拒绝script导入jQuery!!

找到一种只在当前js组件中引入jQuery,并且使用webpack切割打包的方案!

测试环境

以下测试在webpack3.8.1,jQuery3.2.1,react16+中进行

思路分析

如果说要我在react中全局引入jQuery,我是十分感动,然后拒绝的。

但是,有时候可能react的一些库不够牛逼,还需要用到jQuery的相关插件来辅助完成,这些插件又和jQuery形成了依赖,最终,和我一样,你也可能需要在react中导入jQuery。

这个时候webpack就派上用场了,你也别百度了,网上的方案我试过很多,说句不好听的,大部分都是乐色!

举个例子,很多博客说用下面这种方案,还有其他一堆乱七八糟的辅助方案。

new webpack.ProvidePlugin({
    $: ‘jquery‘,
    jQuery: ‘jquery‘,
    ‘window.jQuery‘: ‘jquery‘,
    ‘window.$‘: ‘jquery‘,
  });

一开始的尝试,我以为是成功的,因为$可以打印出来了啊!但是,当我打印jQuery的时候,报错了!!

jQuery is not defined

接着,就是一个漫长的探索过程,我以为是CMD的锅、我以为是AMD的锅、我还以为是ES6的锅、甚至我坚定的认为是webpack的锅!!

最终答案

最终我发现就是webpack的锅,幸好webpack提供了另外一种支持方案。

1、安装expose-loader

npm install --save expose-loader

2、在webpack.config中加入下面这段loader代码

{
   test: require.resolve(‘jquery‘),
   use: [{
      loader: ‘expose-loader‘,
      options: ‘jQuery‘
   },{
      loader: ‘expose-loader‘,
      options: ‘$‘
   }]
}

3、下面该干嘛?放心,你什么都不用干了,接着很轻松的在你的react组件中导入jQuery

import React from ‘react‘

require(‘jquery‘)
require(‘jQuery第三方插件‘)

class Components extends React.Component {
    constructor(props) {
        super(props)
    }
    componentDidMount() {
         $(document).ready(function() {
            //做爱做的事情
        })
    }
}

4、这里可能还存在一个小坑,就是很多jQuery第三方插件的作者写的代码不规范,我就遇到了一些变量没有声明的情况,在那些老程序员眼里,js变量不声明表示全局变量,但在webpack眼里,你不声明就未定义了!如果你遇到jQuery插件未定义的报错,通常给这个变量加上var就行了!

5、最后,我自己写的组件本身已经融入了异步打包功能,所以当前包含jQuery的react组件不会污染其他react组件,不会导致其他组件的体积变大,也不会导致公共js的体积变化,前提是你也实现了react组件的异步加载功能。

6、关于webpack异步打包组件的方案,请看我的其他文章!

只要你使用了webpack,无论是react,还是vue开发者也同样适用这种方案

本人引用地址:https://segmentfault.com/a/1190000012112912

原文地址:https://www.cnblogs.com/qiqi105/p/8726919.html

时间: 2024-08-23 21:59:35

webpack4导入jQuery的新方案的相关文章

开发者协会暑假招新方案

我们协会已经开始运作咯,谢谢大家这段时间的关注&支持! --------------- 终于可以宣布 计算机科学系 开发者协会 成型啦!我们低调地调查,低调地组织,低调地成立,低调地做规划.现在,我们稍微高调地宣传. 我们的宣传方案也很简单,首先请各班班长帮忙群发下面标记红色的短信内容: 大伙,系里的开发者协会开始招新了.协会的驱动形式是这样的:组织系里优秀的学生到讲师组给大伙培训,然后将大伙中表现良好的送到实验室.工作室.企业实习,然后又把优秀的学生邀请到讲师组,死循环-现在暑假集训方案:8月

在eclipse中导入jquery包后报错的解决办法

eclipse导入jquery包后报错,处理步骤如下:  1.关闭Eclipse,打开对应项目的.project文件,去掉如下内容:         org.eclipse.wst.jsdt.core.javascriptValidator       2.删除项目中原来的jquery支持包,重启重新复制一份,因为原来的文件已被eclipse项目标记为错误了,之后报错解决.

Atitit.jquery 版本新特性attilax总结

Atitit.jquery 版本新特性attilax总结 1. Jq1.4 1 2. 1.5 1 3. 1.6 3 4. Jq1.7 3 ⒉提升了事件委派时的性能有了大幅度的提升,尤其是在ie7下: 4 ⒊更好的在 ie 6/7/8 上支持 html5: 4 ⒋切换动画更加直观: 4 ⒌匿名模块定义 awd 4 ⒍jQuery.Deferred 4 ⒎jQuery.isNumeric() 4 5. Jq1.8 5 5.1. jQuery 1.8 5 5.1.1. 可定制 5 5.1.2. 自动生

Django+JQuery+Ajax+Post方案中的问题及解决

遇到的问题 请求发送后,服务端无响应 Django对于POST请求会检查请求来源,表单方式提交时: 在Form内添加 `{% csrf_token %}` 标签: request响应函数前,添加 `@csrf_exempt` ; Jquery POST 方式提交时,在服务端添加了 @csrf_exempt ,在Django1.5版本后,无法直接通过POST获取参数,通过`raw_data = request.body` 获取数据时,出现如下错误提示: Exception: You cannot

小区IPTV新方案

小区IPTV新方案,适用所有直播视频源

jsp导入jquery库

如果jquery库在本地,可用如下代码: <head><script type="text/javascript" src="jquery.js"></script></head> 如果不用本地库,也可用如下代码: <head> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs

jQuery数据缓存方案详解:$.data()的使用

我们经常使用隐藏控件或者是js全局变量来临时存储数据,全局变量容易导致命名污染,隐藏控件导致经常读写dom浪费性能.jQuery提供了自己的数据缓存方案,能够达到和隐藏控件.全局变量相同的效果,但是jQuery实现方式更优雅.为了更好地使用jQuery数据缓存方案,我们需要掌握$.data().$.cache.$.expando.$.hasData().$.removeData(). $.hasData()用来判断某个对象是否有附加的属性,可以给任何JavaScript对象和HTMLElemen

服务器过载保护(下篇)——过载处理新方案

文/iven 1 前言 世界上不存在绝对完美的系统,我们不是上帝,出现问题是必然的.但出现问题并不可怕,关键是否能够处置好问题. 过载的出现,理论上都有可能产生,向任何向外提供的服务,发起DDos攻击,都可以认为是过载的发生.在发生过载的情况下,处置不好的话,很可能出现下列情况: 当出现过载的情况下,拒绝请求是必然的,否则就不能称之为过载,拒绝请求即相当于降低了请求量.但根据业务不同,具体的处置方式,也会有所不同.好的过载处理方式,能够保证系统在过载时,提供较高的稳定处理能力: 由此我们得出了一

基于jQuery的新浪游戏首页幻灯片

分享一款基于jQuery的新浪游戏首页幻灯片,带左右箭头,选项卡缩略图,自动轮播切换的jQuery幻灯片代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: Html代码   <br><center> <div class='Homeslide'> <div class='Homeslide_bigwrap'> <div class='Homeslide_hand0'></div> <div class='H