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 相关文章推荐
javascript客户端解决方案 缓存提供程序
Jul 14 Javascript
Jquery Ajax的Get方式时需要注意URL地方
Apr 07 Javascript
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
Aug 13 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
Nov 08 Javascript
Jquery遍历checkbox获取选中项value值的方法
Feb 13 Javascript
ECMAScript6块级作用域及新变量声明(let)
Jun 12 Javascript
jquery实现简单实用的打分程序实例
Jul 23 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
Jul 13 Javascript
基于js 字符串indexof与search方法的区别(详解)
Dec 04 Javascript
babel的使用及安装配置教程
Feb 22 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
Sep 29 Javascript
vue实现form表单与table表格的数据关联功能示例
Jan 29 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
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
php下图片文字混合水印与缩略图实现代码
2009/12/11 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
2012/07/19 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
php中$_POST与php://input的区别实例分析
2015/01/07 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
2016/03/23 PHP
PHP反射学习入门示例
2019/06/14 PHP
Javascript中的this绑定介绍
2011/09/22 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
js文件缓存之版本管理详解
2013/07/05 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
jQuery ztree实现动态树形多选菜单
2016/08/12 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
2016/08/25 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
常用的 JS 排序算法 整理版
2018/04/05 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
Python实现FLV视频拼接功能
2020/01/21 Python
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
致400米运动员广播稿
2014/02/07 职场文书
《毛主席在花山》教学反思
2014/04/20 职场文书
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
详解MindSpore自定义模型损失函数
2021/06/30 Python
Django路由层如何获取正确的url
2021/07/15 Python