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 相关文章推荐
ajax+jQuery实现级联显示地址的方法
May 06 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
Aug 27 Javascript
原生JS实现美图瀑布流布局赏析
Sep 07 Javascript
jQuery取得iframe中元素的常用方法详解
Jan 14 Javascript
jQuery Mobile操作HTML5的常用函数总结
May 17 Javascript
js学习阶段总结(必看篇)
Jun 16 Javascript
无法获取隐藏元素宽度和高度的解决方案
Mar 07 Javascript
js+html5实现侧滑页面效果
Jul 15 Javascript
JavaScript设计模式之建造者模式实例教程
Jul 02 Javascript
JavaScript实现美化滑块效果
May 17 Javascript
vue实现匀速轮播效果
Jun 29 Javascript
js简单粗暴的发布订阅示例代码
Jan 23 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中长文章分页显示实现代码
2012/09/29 PHP
PHP正确解析UTF-8字符串技巧应用
2012/11/07 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
js 对象是否存在判断
2009/07/15 Javascript
7个Javascript地图脚本整理
2009/10/20 Javascript
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
理解javascript中try...catch...finally
2015/12/25 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
JavaScript常用数学函数用法示例
2018/05/14 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
vue中使用codemirror的实例详解
2018/11/01 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
python实现堆和索引堆的代码示例
2018/03/19 Python
详解Python 函数如何重载?
2019/04/23 Python
django之对FileField字段的upload_to的设定方法
2019/07/28 Python
python turtle 绘制太极图的实例
2019/12/18 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
python 利用toapi库自动生成api
2020/10/19 Python
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
你对IPv6了解程度
2016/02/09 面试题
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
酒店保洁主管岗位职责
2013/11/28 职场文书
高中毕业自我鉴定
2013/12/22 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
酒店财务总监岗位职责
2015/04/03 职场文书