webpack里手写一个多页面打包的通用方案

回顾

上篇文章我们打包了一个detail出口文件的所要做的事情:先在配置文件里去设置入口,然后在插件里new 一个HtmlWebpackPlugin并进行配置。_这只是一个,如果还有其他的文件需要打包处理呢,比如login、index这两个文件,如果也做打包处理,按照上面打包detail的步骤再来2遍,打包三个,我们需要这样重复3次,是不是太累了?如果文件很多,都要一个一个这样添加吗?_当然有解决方案。我们可以自己写一个方法去解放上面手动添加的烦恼,也就是 多页面打包的通用方案

手写多页面打包的通用方案

我们知道,要添加一个出口页面,我们需要执行的操作是:

1.先在配置文件里去设置入口文件。
2.插件里new 一个HtmlWebpackPlugin并进行配置。

新建一个配置文件

为了方便查看,我们重新建一个配置文件webpack.test.config.js,想要此文件生效,我们记着一定要在package.json这样设置:

就OK了,生成的文件如下:

手写代码

我们再来写一下webpack.test.config.js中的代码:

先分析一波

**首先我们先把webpack.config.js中的代码复制过来,然后代码里面新增一个runTest方法,它会返回我们想要的2个重要数据;****里面定义两个变量分别是出口js文件合集的entrys变量,它是一个对象,我们先初始化为一个空对象,另一个是出口多页面的一个集合htmlwebpackplugins变量,它是一个数组,我们先初始化为一个空数组;**然后把这两个变量返回,最后调用runTest方法并通过解构拿到entrys, htmlwebpackplugins变量;代码如下:

function runTest(){var entrys={},htmlwebpackplugins=[];return {entrys,htmlwebpackplugins}
}
const {entrys,htmlwebpackplugins}=runTest(); 

至于为什么要把出口 js 文件定义成一个对象,而把多页面出口文件定义成一个数组,我们可以看下面原先的配置是这样的:

<img src=“https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/146a9cdf04f34cad9720fb2de8065bf1~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image?)入口配置entry那里,它本身就是个对象,所以我们只要把最后的所有入口文件的集合放在这里就好了。然后多页面html那里,它是由多个相同的 new HtmlWebpackPlugin({ //模板的相对或者绝对路径 template: "...", filename: "...", } )这种格式构成,所以我们这里的集合设置成一个数组,到时候一解构就可以啦” style=“margin: auto” />

所以我们这样写:

上代码

我们回过头来继续填充runTest方法里面的代码,直接上代码如下:

var glob=require('glob');
function runTest(){var entrys={},htmlwebpackplugins=[];const entryFiles = glob.sync(path.join(__dirname, "./src/*/index.js"));console.log('==============>',entryFiles);entryFiles.map((item,index)=>{ letmatch=item.match(/src/(.*)/index.js/); console.log('match=====>',match); let pageName=match[1]; entrys[pageName]=item;htmlwebpackplugins.push( new HtmlWebpackPlugin({ // "./src/index.html" template: `./src/${pageName}.html`, // "index.html" filename: `${pageName}.html`, chunks:[pageName] } ), )})return {entrys,htmlwebpackplugins}
}
const {entrys,htmlwebpackplugins}=runTest(); 

分析代码

分析一波这段代码:

entry: {index: './src/index.js',list: './src/list.js',detail:'./src/detail/index.js',
}, 

首先我们看一下原先entry里面对象里的每一项,分别是一个chunks的键名key也就是属性名,value是对应的入口文件路径

所以我们再分析上述runTest里面的代码:先定义两个变量分别存放入口文件的集合的entrys变量和存放多页面集合的htmlwebpackplugins变量。然后,**path.join()是拼接路径,参数./src/*/index.js就是路径片段,这里*是通配符所有任意字符的意思;**比如可以匹配到./src/index/index.js./src/detail/index.js./src/login/index.js等都是可以匹配到的。然后glob.sync是可以返回找到与模式匹配的所有文件名。返回的值如下:

npm install glob 

关于glob.sync的详情官网文档资料如下: <img src=“https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/311d04b724df46a4a0813437eaa253cf~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image?)[具体glob文档链接](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fisaacs%2Fnode-globl “https://github.com/isaacs/node-globl”” style=“margin: auto” />

path.join具体详情官方资料:

path其他详情看这里,官方文档

再继续往下看,**我们用math+正则去查找每项对应的字符信息;**使用正则时,遇到特殊字符就要用\进行转义, .:匹配除换行符 \n 之外的任何单字符, *:匹配前面的子表达式零次或多次我们用变量math接受到了查找到的符合条件的所有信息的数组

看下打印结果:

我们用变量pageName去保存chunks的值;然后把每项的值保存在entry里最后再往htmlwebpackplugins去push值,里面都用到了pageName的值,事实上,多页面配置里面也就这个变量的值不同,其他都一样最后,就是把这个entryshtmlwebpackpluginsreturn出去

看成果

以上代码就算是写完了,最后我们需要把打包的文件名改成test,为了和之前的dist区分开,代码如下:webpack.test.config.js:

构建成功后,目录下新增了一个test的目录,里面的文件就是我们打包所需的文件,

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340