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 相关文章推荐
JQuery select控件的相关操作实现代码
Sep 14 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
Oct 13 Javascript
详解用vue.js和laravel实现微信授权登陆
Jun 23 Javascript
微信小程序实现自定义modal弹窗封装的方法
Jun 15 Javascript
示例vue 的keep-alive缓存功能的实现
Dec 13 Javascript
Vue 实现手动刷新组件的方法
Feb 19 Javascript
微信小程序中使用echarts的实现方法
Apr 24 Javascript
vue读取本地的excel文件并显示在网页上方法示例
May 29 Javascript
vue的三种图片引入方式代码实例
Nov 19 Javascript
加速vue组件渲染之性能优化
Apr 09 Javascript
JS原型对象操作实例分析
Jun 06 Javascript
微信小程序的引导页实现代码
Jun 24 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中的观察者模式
2010/03/24 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
jQuery 标题的自动翻转实现代码
2009/10/14 Javascript
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
js滚轮事件兼容性问题需要注意哪些
2016/11/15 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
jQuery实现点击关注和取消功能
2017/07/03 jQuery
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
2017/09/11 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
2018/02/08 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
django 实现简单的插入视频
2020/04/07 Python
英国音乐设备和乐器商店:Gear4music
2017/10/16 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
材料采购员岗位职责
2013/12/17 职场文书
教师个人读书活动总结
2014/07/08 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
2014年小学英语教师工作总
2014/12/03 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python