webpack多页面开发实践


Posted in Javascript onDecember 18, 2017

写在前面

webpack是一款模块加载器兼打包工具,能把js,css,页面,图片,视频等各种资源,进行模块化处理。而现在网上流传很多单页面的webpack模型,那多页面呢?比较少,现在我提供一个多页面的前端模型。希望大家适合使用。

在最开始接触webpack的时候,我都觉得webpack只适用于单页面应用,比如webpack+react,webpack+vue。我自己在使用webpack+vue构建项目及开发的过程中感受到了webpack的强大和方便。基于实际项目需求,我在想,多页面站点是否也能使用webapck来构建呢?于是就开始了一番探索,最终算是搭建了一套比较完整的解决方案。

本文以一个实际项目为例子,讲述在多页面项目中如何使用webpack进行工程化构建。本文是自己的实践经验总结,所以有些解决方案并不是最优的,仍在探索优化中,如果有什么错误纰漏,欢迎指出。

简介

本项目主要基于webpack2.x构建,以gulp作为辅助工具。前端使用art-template作为模板引擎,一个页面对应一个模板文件和一个入口文件,入口文件中可以通过import或require引入其他模块,这些模块webpack会自动跟入口文件合并为一个文件。

前端开发环境搭建

主要目录结构

├─dist          #打包后生成的文件目录
└─src           #开发目录
  ├─components     #通用组件
  ├─static       #静态资源目录
  │ ├─css
  │ ├─img
  │ └─js
  │   ├─component  #站点通用组件对应的js
  │   ├─lib     #第三方js库
  │   ├─services   #各页面入口
  │   └─util     #通用工具js
  ├─template      #html模板
  └─views        #页面
   main.js       #公共入口
gulpfile.js        #gulp任务配置
package.json       #项目依赖
webpack.config.js     #webpack配置

webpack配置

入口文件

// 获取入口文件
var entries = (function() {
  var jsDir = path.resolve(__dirname, 'src/static/js/services');
  var entryFiles = glob.sync(jsDir + '/*.js');
  var map = {};

  entryFiles.forEach(function(filePath) {
    var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'));
    map[filename] = filePath;
  });
  return map;
})();

该方法将生成文件名到文件绝对路径的map, 比如

entry: {
  'page-1': '/../webpack-multipage-demo/src/static/js/services/page-1.js'
}

热更新

热更新简直不要太好用,极大地提高了开发效率。

//服务器配置
var devServer = env === 'production' ? {} : {
  contentBase: path.resolve(__dirname),
  compress: true,
  historyApiFallback: true,
  hot: true,
  inline: true,
  host: 'localhost', 
  port: 8080
};

另外,在plugin中加入new webpack.HotModuleReplacementPlugin(),开启Hot Module Replacemen,即可实现热更新。

生成html配置

约定同一页面的js文件与模板文件命名一致,最终根据该js生成与其同名的html文件。

var htmlPages = (function() {
  var artDir = path.resolve(__dirname, 'src/views');
  var artFiles = glob.sync(artDir + '/*.art');
  var array = [];
  artFiles.forEach(function(filePath) {
    var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'));
    array.push(new HtmlWebpackPlugin({
      template: path.resolve(__dirname, 'src/template/index.html'),
      filename: filename + '.html',
      chunks: ['vendor', 'main', filename],
      chunksSortMode: function(chunk1, chunk2) {
        var order = ['vendor', 'main', filename];
        var order1 = order.indexOf(chunk1.names[0]);
        var order2 = order.indexOf(chunk2.names[0]);
        return order1 - order2;
      },
      minify: {
        removeComments: env === 'production' ? true : false,
        collapseWhitespace: env === 'production' ? true : false
      }
    }));
  });
  return array;
})();

通用模块提取为组件

对于一些在多个页面中都需要用到的模块,可将其提取出来作为通用的组件。组件的构成与页面一样,一个.js文件和一个.art文件以及一个.css文件,在js文件中渲染html内容,最后export,使用时直接require即可。具体实践可参考demo

存在问题

  1. 每新建一个页面就需要重新启动webpack服务
  2. 字体文件无法压缩,对于压缩通过font-face引入的网络字体,目前没有找到较好的解决方案

demo

基于本文理论的一个demo,地址:webpack-multipage-demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript初学者建议:不要去管浏览器兼容
Feb 04 Javascript
JS实现简单易用的手机端浮动窗口显示效果
Sep 07 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
Dec 14 Javascript
JS实现复制内容到剪贴板功能
Feb 05 Javascript
js学习总结_选项卡封装(实例讲解)
Jul 13 Javascript
Vue数据监听方法watch的使用
Mar 28 Javascript
vue-router启用history模式下的开发及非根目录部署方法
Dec 23 Javascript
javaScript把其它类型转换为Number类型
Oct 13 Javascript
在VUE中实现文件下载并判断状态的方法
Nov 08 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
Oct 17 Javascript
Vue开发中常见的套路和技巧总结
Nov 24 Vue.js
如何用vue实现网页截图你知道吗
Nov 17 Vue.js
Vue侧滑菜单组件——DrawerLayout
Dec 18 #Javascript
switchery按钮的使用方法
Dec 18 #Javascript
three.js实现3D影院的原理的代码分析
Dec 18 #Javascript
JS函数节流和函数防抖问题分析
Dec 18 #Javascript
vue 将页面公用的头部组件化的方法
Dec 18 #Javascript
浅谈使用React.setState需要注意的三点
Dec 18 #Javascript
vue 项目如何引入微信sdk接口的方法
Dec 18 #Javascript
You might like
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
2014/11/20 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
PHP图片水印类的封装
2017/07/06 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
jQuery each()小议
2010/03/18 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
jQuery获得document和window对象宽度和高度的方法
2015/03/25 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
原生js的RSA和AES加密解密算法
2016/10/08 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
Vue 进阶教程之v-model详解
2017/05/06 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
2017/12/05 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
python使用scrapy解析js示例
2014/01/23 Python
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
基于Python 的进程管理工具supervisor使用指南
2016/09/18 Python
python发送告警邮件脚本
2018/09/17 Python
Python模拟登录之滑块验证码的破解(实例代码)
2019/11/18 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
实习护理工作自我评价
2013/09/25 职场文书
专业实习自我鉴定
2013/10/29 职场文书
医学检验专业个人求职信范文
2013/12/04 职场文书
行政部岗位职责范本
2014/03/13 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
学习党章心得体会2016
2016/01/15 职场文书
Python使用psutil库对系统数据进行采集监控的方法
2021/08/23 Python
Moment的feature导致线上bug解决分析
2022/09/23 Javascript