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的常见兼容问题及相关解决方法(chrome/IE/firefox)
Dec 31 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
Jan 11 Javascript
ArtEditor富文本编辑器增加表单提交功能
Apr 18 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
May 19 Javascript
jquery自适应布局的简单实例
May 28 Javascript
JS实现“隐藏与显示”功能(多种方法)
Nov 24 Javascript
js生成word中图片处理方法
Jan 06 Javascript
基于JavaScript实现幸运抽奖页面
Jul 05 Javascript
微信小程序如何像vue一样在动态绑定类名
Apr 17 Javascript
vue调用语音播放的方法
Sep 27 Javascript
vue动画—通过钩子函数实现半场动画操作
Aug 09 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
Sep 14 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批量更改数据库表前缀实现方法
2013/10/26 PHP
php 使用array函数实现分页
2015/02/13 PHP
php随机抽奖实例分析
2015/03/04 PHP
PHP编写RESTful接口的方法
2016/02/21 PHP
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
js 键盘记录实现(兼容FireFox和IE)
2010/02/07 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
2018/12/10 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
Vue3+elementui plus创建项目的方法
2020/12/01 Vue.js
Python中操作MySQL入门实例
2015/02/08 Python
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
Django 使用logging打印日志的实例
2018/04/28 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Python 实现PS滤镜的旋涡特效
2020/12/03 Python
Python LMDB库的使用示例
2021/02/14 Python
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
秋季婚礼证婚词
2014/01/11 职场文书
初三化学教学反思
2014/01/23 职场文书
学生会招新策划书
2014/02/14 职场文书
物理研修随笔感言
2014/02/14 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
奉献家乡演讲稿
2014/09/13 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技
Nginx 匹配方式
2022/05/15 Servers
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android