详解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 相关文章推荐
让您的菜单不离网站
Oct 03 Javascript
jquery 模式对话框终极版实现代码
Sep 28 Javascript
jquery如何把参数列严格转换成数组实现思路
Apr 01 Javascript
js获取select默认选中的Option并不是当前选中值
May 07 Javascript
node.js中使用socket.io的方法
Dec 15 Javascript
js实现iframe自动自适应高度的方法
Feb 17 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
Dec 25 Javascript
浅析JS原型继承与类的继承
Apr 07 Javascript
原生JS实现-星级评分系统的简单实例
Aug 21 Javascript
angular-ui-sortable实现可拖拽排序列表
Dec 28 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
Sep 14 Javascript
layui2.0使用table+laypage实现真分页
Jul 27 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的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
前端性能优化及技巧
2016/05/06 Javascript
基于javascript实现表格的简单操作
2016/05/21 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
2018/11/10 Javascript
jquery实现选项卡切换代码实例
2019/05/14 jQuery
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
python笔记(1) 关于我们应不应该继续学习python
2012/10/24 Python
centos系统升级python 2.7.3
2014/07/03 Python
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
python XlsxWriter模块创建aexcel表格的实例讲解
2018/05/03 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
python统计中文字符数量的两种方法
2019/01/31 Python
Python reduce函数作用及实例解析
2020/05/08 Python
Python如何创建装饰器时保留函数元信息
2020/08/07 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
初中生学习生活的自我评价
2013/11/20 职场文书
党员培训思想汇报
2014/01/07 职场文书
通信工程求职信
2014/07/16 职场文书
升职自我推荐信范文
2015/03/25 职场文书
小学入学感言
2015/08/01 职场文书
导游词之山海关
2019/12/10 职场文书
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS
MySQL 数据库 增删查改、克隆、外键 等操作
2022/05/11 MySQL