webpack4系列教程,如何理解externals属性?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
本文中,苏南大叔带大家理解一下externals
属性,本文中的实验例子还是jquery
。externals
属性是webpack
的配置文件里面的一个项目,不用额外安装什么乱七八糟的plugin
或者loader
。
本文测试环境:win10
、node@14.2.0
、npm@6.14.4
、webpack@4.43.0
、jquery@3.5.1
。
添加引用
模板html
里面添加jquery.js
的引用:
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
对应的入口文件js
里面,还要保留对应的import
或者require
。
let jq = require("jquery");
import jq from "jquery";
这里的jquery
,并不是个固定不变的名字,在本文中,它可以被externals
属性所改变。这里先留个伏笔。在入口文件main.js
里面,苏南大叔还是这么使用的:
jq("#test").html("test3");
$("#test").html("test3");
jQuery("#test").html("test3");
这三行代码中,jq
函数来自import
或者require
,继而来自externals
转化外部的jquery.js
。而$
和jQuery
则直接来着外部的jquery.js
生成的全局变量。
修改配置文件
因为本文还是加载jquery
,所以,记得清空相关配置项目,比如:expose-loader
或者webpack.ProvidePlugin
等。具体情况可以参见文末链接。
webpack.config.js
:
module.exports = {
mode: 'production', // 环境
plugins: [
// new webpack.ProvidePlugin({
// $: 'jquery',
// jQuery: 'jquery',
// jq:'jquery',
// }),
],
module: {
rules: [
//...
// {
// test: require.resolve('jquery'),
// use: [
// {
// loader: 'expose-loader',
// options: '$'
// },
// ]
// },
]
},
externals: {
'jquery': '$',
//'jquery': 'jQuery',
//'jquery': 'jQuery.noConflict()'
}
}
重点项目是:
externals: {
'jquery': '$',
}
- 左边的键名,是可以自定义的。主要是用于在模块化的
js
文件中,用来require
或者import
的。 - 右边的键值,是已经存在的某个
window
全局变量或者函数。比如在本文中,因为外联引入了jquery.js
。所以存在着全局的$
和jQuery
。甚至一条js
语句,也是合法的键值。例如:jQuery.noConflict()
。
所以在这里,下面的两个配置文件也是可以的。
externals: {
'jquery': 'jQuery',
}
externals: {
'jquery': 'jQuery.noConflict()'
}
修改名字
因为键名可自定义,所以:webpack.config.js
:
externals: {
'myjq': '$',
}
main.js
:
let jq = require("myjq");
//import jq from "myjq";
jq("#test").html("test3");
相关链接
- https://newsn.net/say/webpack-start.html
- https://newsn.net/say/webpack-jquery.html
- https://newsn.net/say/webpack-expose-loader.html
- https://newsn.net/say/webpack-provide-plugin.html
总结
本文中,就是把jquery.js
给抽取出来,成为了一个单独的js
。然后又通过webpack
的externals
,配置成了一个可识别的模块。这个时候,编译后的main.js
里面,虽然require
或者import
了,但是并不包含jquery.js
的内容,从某种角度上来说,避免了多次重复加载的问题。
更多webpack
相关文章,请点击:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。