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[js]获取url参数的代码
Oct 17 Javascript
jQuery 连续列表实现代码
Dec 21 Javascript
jQuery实现点击标题输入详细信息
Apr 16 Javascript
javascript动态创建链接的方法
May 13 Javascript
Vue.JS入门教程之处理表单
Dec 01 Javascript
Bootstrap3 多选和单选框(checkbox)
Dec 29 Javascript
走进javascript——不起眼的基础,值和分号
Feb 24 Javascript
easyui简介_动力节点Java学院整理
Jul 14 Javascript
微信小程序之swiper滑动面板用法示例
Dec 04 Javascript
JS实现的贪吃蛇游戏案例详解
May 01 Javascript
react中的DOM操作实现
Jun 30 Javascript
JavaScript的Set数据结构详解
Feb 18 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
PHP4在Windows2000下的安装
2006/10/09 PHP
来自PHP.NET的入门教程
2006/10/09 PHP
php 启动时报错的简单解决方法
2014/01/27 PHP
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
php 多文件上传的实现实例
2016/10/23 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
Laravel框架源码解析之反射的使用详解
2020/05/14 PHP
javascript编码的几个方法详细介绍
2013/01/06 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
AngularJS中实现动画效果的方法
2016/07/28 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
[02:48]DOTA2英雄基础教程 暗夜魔王
2013/12/12 DOTA
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
tornado捕获和处理404错误的方法
2014/02/26 Python
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
详解Python文本操作相关模块
2017/06/22 Python
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
工程造价专业大专生求职信
2013/10/06 职场文书
大学自主招生自荐信范文
2014/02/26 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android