webpack 3.X学习之多页面打包的方法


Posted in Javascript onSeptember 04, 2018

简介

我们开发不可能只写一个页面,每次都要写很多页面,这时为了开发效率,我们使用前端自动化工具webpack,那么webpack是如何打包页面的呢?又是如何打包多页面的呢?

单页面打包

我们知道要打包单页面的方法,很简单,配置入口,和html插件,

const HtmlWebpackPlugin = require('html-webpack-plugin');

const config = {
 entry:{
  index:'./src/index.js'
 },
 output:{
  path: path.join(__dirname, 'dist'),
  filename: 'js/index.js'
 }
 ...
 plugins:[
  new HtmlWebpackPlugin({
   filename: 'index.html',
   template: './src/index.html',
   hash: true,
   minify: {
    removeAttributeQuotes:true,
    removeComments: true,
    collapseWhitespace: true,
    removeScriptTypeAttributes:true,
    removeStyleLinkTypeAttributes:true
   }
  })
 ]
}

上面的配置就是打包一个单页面的代码,具体配置项的意思请参考HTMLWebpackPlugin;

如何打包多页面

在学了webpack之后,我的感受是我会配置webpack了,也能运行了,但是学习的过程中都是单页面的,那么多页是如何打包的呢?其实多页面的打包和单页面的打包的原理是一样的,只是多配置几个对应的入口,和出口,以及HtmlWebpackPlugin对象;当然你完全可以像下面这样:

const config = {
 entry:{
  index:'./src/index.js',
  info:'./src/index.js'
 },
 output:{
  path: path.join(__dirname, 'dist'),
  filename: 'js/[name].js'
 }
 ...
 plugins:[
  new HtmlWebpackPlugin({
   filename: 'index.html',
   template: './src/index.html',
   chunks:['index'],
   hash: true,
   minify: {
    removeAttributeQuotes:true,
    removeComments: true,
    collapseWhitespace: true,
    removeScriptTypeAttributes:true,
    removeStyleLinkTypeAttributes:true
   }
  }),
  new HtmlWebpackPlugin({
   filename: 'info.html',
   template: './src/info.html',
   hash: true,
   chunks:['info'],
   minify: {
    removeAttributeQuotes:true,
    removeComments: true,
    collapseWhitespace: true,
    removeScriptTypeAttributes:true,
    removeStyleLinkTypeAttributes:true
   }
  })
 ]
}

细心的你肯定发现我改变了几个地方,一是,把output.filename的‘js/index.js'变成了‘js/[name].js',这是因为我们是多页面,每个页面对应相应的js这样方便管理,二是,在HtmlWebpackPlugin对象中添加了chunks这个属性,chunk属性是让你选择对应的js模块;

上面这种写法当然是没有问题,这是只有两个页面无所谓,那么有十个甚至更多呢,我们一直做着重复的事,这不是我们程序员的风格,我们就是为了能够偷懒才做程序员的不是吗?(当然还有高工资(#^.^#)),接下来我们来抽离这些重复的事;

首先,我们通过Node的glob对象,来获取我们存在的html或js;

/**
*
* @param {string} globPath 文件的路径
* @returns entries
*/
function getView(globPath,flag){
 let files = glob.sync(globPath);

 let entries = {},
 entry, dirname, basename, pathname, extname;

 files.forEach(item => {
  entry = item;
  dirname = path.dirname(entry);//当前目录
  extname = path.extname(entry);//后缀
  basename = path.basename(entry, extname);//文件名
  pathname = path.join(dirname, basename);//文件路径
  if (extname === '.html') {
   entries[pathname] = './' + entry;
  } else if (extname === '.js') {
   entries[basename] = entry;
  }
 });

 return entries;
}

既然,我们已经有了getView()函数,可以获取html和js文件,那么我们就可以确定有多少个入口,和多少个页面;
let entriesObj = getView('./src/js/*.js');

let config = {
 entry:entriesObj,
 ...
}

上面我们就配置好了入口,不需要我们手动添加了,有多少js就有多少入口;

let pages = Object.keys(getView('./src/*html'));

pages.forEach(pathname => {
 let htmlname = pathname.split('src\\')[1];
 let conf = {
  filename: `${htmlname}.html`,
  template: `${pathname}.html`,
  hash: true,
  chunks:[htmlname],
  minify: {
   removeAttributeQuotes:true,
   removeComments: true,
   collapseWhitespace: true,
   removeScriptTypeAttributes:true,
   removeStyleLinkTypeAttributes:true
  }
 }

 config.plugins.push(new HtmlWebpackPlugin(conf));
});

最后,我们获取HTML页面,和添加对应页面的HTMLWebpackPlugin对象;

后记

通过以上的三个步骤,就可以配置好一个可以打包多页面的webpack工具;本人的水平比较有限,在书写的过程中,可能有很多说的比较模糊,请多多包涵,也请大神拍砖,多多指教

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

Javascript 相关文章推荐
解决FireFox下[使用event很麻烦]的问题
Nov 26 Javascript
零基础学JavaScript最新动画教程+iso光盘下载
Jan 22 Javascript
使用js如何实现全选与全不选
Dec 30 Javascript
JavaScript中输出标签的方法
Aug 27 Javascript
jQuery1.9+中删除了live以后的替代方法
Jun 17 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
Jul 12 Javascript
纯js三维数组实现三级联动效果
Feb 07 Javascript
微信小程序实现给循环列表添加点击样式实例
Apr 26 Javascript
关于JS解构的5种有趣用法
Sep 05 Javascript
VUE中使用HTTP库Axios方法详解
Feb 05 Javascript
jquery实现图片放大镜效果
Dec 23 jQuery
js仿淘宝放大镜效果
Dec 28 Javascript
JS获取并处理php数组的方法实例分析
Sep 04 #Javascript
vue click.stop阻止点击事件继续传播的方法
Sep 04 #Javascript
vue form 表单提交后刷新页面的方法
Sep 04 #Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
Dec 30 #Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
Sep 04 #Javascript
JS中DOM元素的attribute与property属性示例详解
Sep 04 #Javascript
JavaScript使用indexOf()实现数组去重的方法分析
Sep 04 #Javascript
You might like
php HandlerSocket的使用
2011/05/02 PHP
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
PHP删除HTMl标签的实现代码
2013/06/30 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
使用JS读秒使用示例
2013/09/21 Javascript
jquery分页对象使用示例
2014/04/01 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
2015/04/16 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
2017/01/10 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
JavaScript直接调用函数与call调用的区别实例分析
2020/05/22 Javascript
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
python 通过字符串调用对象属性或方法的实例讲解
2018/04/21 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
详解canvas.toDataURL()报错的解决方案全都在这了
2020/03/31 HTML / CSS
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
企业演讲稿范文
2013/12/28 职场文书
还款承诺书范文
2014/05/20 职场文书
商铺租房协议书范本
2014/12/04 职场文书
2015人事行政工作总结范文
2015/05/21 职场文书
详解MySQL的半同步
2021/04/22 MySQL
基于docker安装zabbix的详细教程
2022/06/05 Servers
Python如何加载模型并查看网络
2022/07/15 Python