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 相关文章推荐
如何在Web页面上直接打开、编辑、创建Office文档
Mar 12 Javascript
jquery实现瀑布流效果分享
Mar 26 Javascript
node.js中的console.dir方法使用说明
Dec 10 Javascript
jquery实现简单合拢与展开网页面板的方法
Sep 01 Javascript
浅谈jQuery hover(over, out)事件函数
Dec 03 Javascript
Node.js 异步异常的处理与domain模块解析
May 10 Javascript
jQuery validata插件实现方法
Jun 25 jQuery
JavaScript模拟文件拖选框样式v1.0的实例
Aug 04 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
Dec 11 jQuery
教你使用vue-cli快速构建的小说阅读器
May 13 Javascript
vue实现瀑布流组件滑动加载更多
Mar 10 Javascript
es6函数中的作用域实例分析
Apr 18 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
PHP Socket 编程
2010/04/09 PHP
PHP CURL模拟GET及POST函数代码
2010/04/25 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
零基础php编程好学吗
2019/10/11 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
2015/08/27 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
2016/06/21 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
vue实现滑动超出指定距离回顶部功能
2019/07/31 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
JS制作简易计算器的实例代码
2020/07/04 Javascript
使用Python对Excel进行读写操作
2017/03/30 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
小学生演讲稿大全
2014/04/25 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
2014年党的群众路线活动个人整改措施
2014/10/28 职场文书
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js