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 相关文章推荐
js获取location.href的参数实例代码
Aug 02 Javascript
如何动态的导入js文件具体该怎么实现
Jan 14 Javascript
js判断字符长度及中英文数字等
Mar 19 Javascript
jQuery实现网页顶部固定导航效果代码
Dec 24 Javascript
vue.js路由跳转详解
Aug 28 Javascript
jQuery EasyUI Layout实现tabs标签的实例
Sep 26 jQuery
vue-cli构建项目使用 less的方法
Oct 04 Javascript
ReactNative之FlatList的具体使用方法
Nov 29 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
Dec 24 Javascript
vue实现点击选中,其他的不选中方法
Sep 05 Javascript
浅析vue-router实现原理及两种模式
Feb 11 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
Jun 04 Javascript
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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
Windows IIS PHP 5.2 安装与配置方法
2009/06/08 PHP
Yii2框架dropDownList下拉菜单用法实例分析
2016/07/18 PHP
php实现用户登陆简单实例
2017/04/04 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
原生JavaScript实现连连看游戏(附源码)
2013/11/05 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
jquery获取select,option所有的value和text的实例
2017/03/06 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
javascript将url解析为json格式的两种方法
2017/08/18 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
vue1.0和vue2.0的watch监听事件写法详解
2018/09/11 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
layui.tree组件的使用以及搜索节点功能的实现
2019/09/26 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
详解Python中的join()函数的用法
2015/04/07 Python
python 类详解及简单实例
2017/03/24 Python
使用python为mysql实现restful接口
2018/01/05 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
python 调整图片亮度的示例
2020/12/03 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
医学生自荐信范文
2013/12/03 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
煤矿安全生产工作总结
2015/08/13 职场文书
2016年暑期见闻作文
2015/11/25 职场文书