详解webpack引入第三方库的方式以及注意事项


Posted in Javascript onJanuary 15, 2019

一般情况下,我们不用担心所使用的第三方库,在npm管理仓库中找不到。

如果需要某一个库,如:jquery,可以直接运行npm install jquery脚本命令来安装这个项目所需要的依赖;

然后,在使用jquery的模块文件中,通过import $ from 'jquery'或者var $ = require('jquery')来引入。

这是常用的在webpack构建的项目中引入第三方库的方式。

注:为了更好的演示示例代码,示例是在nodemon这篇文章的基础上操作的。

但是,在不同的场景下,对webpack构建的项目有不同的需求:

项目的体积足够小(cdn)

如果是webapck的处理方式,可参考webapck——实现构建输出最小这篇文章。

使用非webapck的处理方式,如:CDN。

操作也很简单,如果使用html-webpack-plugin直接在模板文件template/index.html中引入某个cdn(如:boot CDN)上的某个第三方库(如:jquery),参考代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>third party</title>
</head>
<body>
  <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
</body>
</html>

然后,在module.js中使用jquery即可,参考代码如下:

require('./module.css');
module.exports = function() {
  $(document.body).append('<h1>hello webpack</h1>')  
}

最后,运行npm run test,构建结束后,你会在浏览器中看到hello webpack字样,背景是红色的页面效果。

全局环境下使用第三方库(provide-plugin or imports-loader)

为了避免每次使用第三方库,都需要用import或者require()引用它们,可以将它们定义为全局的变量。

而webpack的ProvidePlugin内置的插件,可以解决这个问题。详情可参考ProvidePlugin这篇文章的介绍。

避免于cdn引用的jquery冲突,这里使用lodash。

首先,安装lodash依赖,命令如下:

yarn add lodash --dev

然后,在webpack.config.js中,添加如下代码:

new webpack.ProvidePlugin({
    _: 'lodash'
}),

其次,在module.js中添加如下代码:

...
var arr = [1, 2, 3, 4, 5 ,6];
// provide-plugin
$(document.body).append('<h1>' + _.concat(arr, '~') + '</h1');
...

最后,运行npm run test脚本命令,构建完成后,你就可以浏览器的页面中增加了1,2,3,4,5,6,~。

如果,你想指定lodash的某个工具函数可以全局使用,如:_.concat,

首先,像下面这样修改webapck.config.js,代码如下:

...
new webpack.ProvidePlugin({
    // _: 'lodash',
    _concat: ['lodash', 'concat']
}),
...

然后,修改module.js,代码如下:

...
var arr = [1, 2, 3, 4, 5 ,6];
// provide-plugin
// $(document.body).append('<h1>' + _.concat(arr, '~') + '</h1');
$(document.body).append('<h1>' + _concat(arr, '~') + '</h1');
...

如果不喜欢用插件的,也可以考虑使用import-loader,它也可以实现相同的目的。

为了避免不必要的干扰,可以使用underscore来演示。

首先,安装imports-loader依赖,命令如下:

yarn add imports-loader --dev

然后,安装underscore依赖,命令如下:

yarn add underscore

其次,在webapck.config.js中添加如下代码:

...
module: {
    rules: [
        {
            test: require.resolve('underscore'),
            use: 'imports-loader?_=underscore'
        },
        ...
    ]
},
...

注:underscore和lodash都是用的是单例的模式开发的,它们实例化的构造函数的名字都是_,为了作区分,需要对其中一个做一下改变。imports-loader对这个标识起别名有点儿困难,而provide-plugin则没有这个问题,可以定一个个性化的别名。

修改webpack.config.js,代码如下:

new webpack.ProvidePlugin({
    // _: 'lodash',
    // _concat: ['lodash', 'concat'],
    __: 'lodash'
}),

可以为lodash定义为__underscore_作区分。

然后,修改module.js,代码如下:

...
// provide-plugin
// $(document.body).append('<h1>' + _.concat(arr, '~') + '</h1');
// $(document.body).append('<h1>' + _concat(arr, '~') + '</h1');
$(document.body).append('<h1>' + __.concat(arr, '~') + '</h1');
...

最后,保存所有的文件,可以下浏览器中看到相似的结果(保存后,nodemon自启动浏览器)。

cdn与externals

之前遇到了一些externals的问题,为什么要详细的说,是因为很多人不明白它到底用来干什么的。

场景再现:

之前,有一个项目使用了jquery,由于这个库的比较经典,它在应用的各个模块中被频繁引用。使用的方式如下:

import $ from 'jquery'

或者

var $ = require('jquery')

结果是构建结束后,文件比较大。那么考虑使用cdn,如上文描述的那样。这样需要删除import或require的引用,同时删除安装的jquery依赖,但是由于项目结构比较乱,模块比较多,为了避免造成少改或者漏改的问题,会造成应用出错。该怎么办呢?

有的人说,不删除jquery依赖,那么使用cdn的目的就没有意义了。而使用external则可以解决这个问题。

可以在module.js文件中添加如下代码:

...
var $ = require('jquery')
...

然后,保存文件,发现构建输出提示如下的错误:

ERROR in ./module.js
Module not found: Error: Can't resolve 'jquery' in 'E:\workspace\me\webpack-play\demo\example-1'
 @ ./module.js 3:0-23
 @ ./main.js
 @ multi (webpack)-dev-server/client?http://localhost:8080 ./main.js

模块module.js中的jquery不能被解析。

紧接着,在webpack.config.js中添加如下代码:

externals: {

  jquery: 'jQuery',
  jquery: '$'
},

其中jquery代表的是require('jquery')中的jquery,而jQuery和$代表的是jquery这个库自身提供的可是实例化的标识符。其它的库的cdn化,修改类似jquery。

但是,如果在项目一开始就决定用cdn的话,就不要在使用jquery的模块中,使用var $ = require('jquery') import $ from 'jquery';,虽然这样做不会报错,但是如果出于某方面的考虑,后期可能会引入jquery依赖,那么就必须使用var $ = require('jquery')import $ from 'jquery';

参考源代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
May 03 Javascript
javascript操作cookie_获取与修改代码
May 21 Javascript
JavaScript的document对象和window对象详解
Dec 30 Javascript
jquery实现表格本地排序的方法
Mar 11 Javascript
vue.js学习笔记之绑定style样式和class列表
Oct 31 Javascript
Vue.js使用v-show和v-if的注意事项
Dec 13 Javascript
解决bootstrap模态框数据缓存的问题方法
Aug 10 Javascript
微信小程序自定义导航教程(兼容各种手机)
Dec 12 Javascript
Layui动态生成select下拉选择框不显示的解决方法
Sep 24 Javascript
微信小程序select下拉框实现源码
Nov 08 Javascript
微信小程序实现导航栏和内容上下联动功能代码
Jun 29 Javascript
vue实现导航菜单和编辑文本的示例代码
Jul 04 Javascript
JS高阶函数原理与用法实例分析
Jan 15 #Javascript
JS立即执行函数功能与用法分析
Jan 15 #Javascript
vue-cli 目录结构详细讲解总结
Jan 15 #Javascript
webpack file-loader和url-loader的区别
Jan 15 #Javascript
jQuery+vue.js实现的多选下拉列表功能示例
Jan 15 #jQuery
Element输入框带历史查询记录的实现示例
Jan 15 #Javascript
微信小程序实现多选删除列表数据功能示例
Jan 15 #Javascript
You might like
php基础知识:函数基础知识
2006/12/13 PHP
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
2013/06/26 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
JavaScript入门教程(8) Location地址对象
2009/01/31 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
2016/09/17 Javascript
JS实现动态修改table及合并单元格的方法示例
2017/02/20 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
基于D3.js实现时钟效果
2018/07/17 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
[17:45]DOTA2 HEROES教学视频教你分分钟做大人-军团指挥官
2014/06/11 DOTA
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
Python中enumerate函数代码解析
2017/10/31 Python
python使用turtle绘制分形树
2018/06/22 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
2019/06/19 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
python梯度下降算法的实现
2020/02/24 Python
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
罗马尼亚在线杂货店:Pilulka.ro
2019/09/28 全球购物
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
打架检讨书范文
2015/01/27 职场文书
听证通知书
2015/04/24 职场文书
2016党员入党决心书
2015/09/22 职场文书
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL