webpack4+react多页面架构的实现


Posted in Javascript onOctober 25, 2018

webpack在单页面打包上应用广泛,以create-react-app为首的脚手架众多,单页面打包通常是将业务js,css打包到同一个html文件中,整个项目只有一个html文件入口,但也有许多业务需要多个页面不同的入口,比如不同的h5活动,或者需要支持seo的官方网站,都需要多个不同的html,webpack-react-multi-page架构让你可以实现多页面架构,在项目开发中保证每个页面都可以热更新并且打包后有清晰的文件层次结构。

Github地址

项目架构

技术使用

  • react16
  • webpack4
    • html-webpack-plugin 生成html文件
    • mini-css-extract-plugin css分离打包
    • uglifyjs-webpack-plugin js压缩
    • optimize-css-assets-webpack-plugin css压缩
  • es6
  • babel
  • node
    • opn 打开浏览器
    • compression 开启gzip压缩
    • express
  • git

目录结构github

|-- webpack-react-multi-page //项目
  |-- dist //编译生产目录
    |-- index
      |-- index.css
      |-- index.js
    |-- about
      |-- about.css
      |-- about.js
    |-- images
    |-- index.html
    |-- about.html
  |-- node_modules //node包
  |-- src //开发目录
    |-- index //index页面打包入口
      |-- images/
      |-- app.js// index业务js
      |-- index.scss
      |-- index.js //index页面js入口
    |-- about //about页面打包入口
      |-- images/
      |-- app.js// about业务js
      |-- index.scss
      |-- index.js //about页面js入口
    |-- template.html // html模板 
    |-- style.scss //公共scss
  |-- webpackConfig //在webpack中使用
    |-- getEntry.js //获取入口
    |-- getFilepath.js //遍历文件夹
    |-- htmlconfig.js //每个页面html注入数据
  |-- package.json
  |-- .gitignore
  |-- webpack.config.js //webpack配置文件
  |-- www.js //生产启动程序

wiki

webpack单页面打包配置

webpack.config.js

module.exports = (env, argv) => ({
  entry: ".src/index.js",
  output: {
    path: path.join(__dirname, "dist"),
    filename: "bundle.js"
  },
  module: {
    rules: [
      ...
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: "首页",
      filename:"index.html",
      favicon:"", 
      template: "./src/template.html", 
    })
  ]
});

这样就可以在dist文件夹下打包出一个下面这样的文件

<!DOCTYPE html>
<html lang="en">
  <head>
  <title>首页</title>
  <body>
    <div id="root"></div>
    <script type="text/javascript" src="bundle.js"></script>
  </body>
</html>

webpack多页面打包配置

webpack 的entry支持两种种格式

打包单个文件

module.exports = {
  entry: '.src/file.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js' 
 }
};

在dist下打包出一个bundle.js

打包出多个文件

module.exports = {
  entry: {
    index:"./src/index.js",
    about:"./src/about.js"
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js' 
  }
};

上面在dist下打包出两个与entry属性名对应的index.js,about.js这两个文件

将每个js挂载到相应的html文件上

这里我们需要用到html-webpack-plugin这个webpack插件,每添加一个页面就需要在plugins添加一个new HtmlWebpackPlugin({....})

const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = (env, argv) => ({
  entry: {
    index:"./src/index.js",
    about:"./src/about.js"
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js' 
  }
  ....//其他配置
  plugins: [
    new HtmlWebpackPlugin(
      {
      filename:"index.html",//生成的index.html
      template: "./src/template.html",}) //模板
      chunks:["index"]
      }),
  new HtmlWebpackPlugin(
      {
        filename:"about.html",//生成的index.html
      template: "./src/template.html",}) //模板
      chunks:["about"]
      })
  ]
})

html-webpack-plugin会通过template.html模板生成对应的filename名的html文件,并一并打包到output中对应的文件夹下,注意,所有打包的文件都是对应到output中path这个目录下,也包括html。这里的chunks需要注意,它是确定该html需要引入哪个js,如果没写的话,默认会引出所有打包的js,当然这不是我们想要的。
上面的配置最终可以在dist下打包出下面的文件结构

|-- dist
  |-- index.js
  |-- about.js
  |-- index.html //内挂载index.js
  |-- about.html //内挂载about.js

通过上面这样的配置,再加上devServer,我们已经可以实现多页面的配置开发了,但这样很不智能,因为你每增加一个页面,就要在wepback里面配置一次,会非常繁琐,所以我们来优化下,让我们只专注于开发页面,配置交给webpack.

wehbpack多页面配置优化

我们看下src下面的文件结构

|-- src
  |-- index
    |-- app.js
    |-- index.scss
    |-- index.js
  |-- about
    |-- app.js
    |-- index.scss
    |-- index.js

src下面每个文件夹对应一个html页面的js业务,如果我们直接把文件夹对应入口js找到并把他们合并生成对应的entry,那是不是就不用手动写entry了呢,再把对应的html-webpack-plugin通过src下目录遍历出来,就可以生成对应的页面。

这样一个完整的多页面架构配置就完成了,完整代码参考项目code

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

Javascript 相关文章推荐
Javascript调用XML制作连动下拉列表框
Jun 25 Javascript
js实现iframe动态调整高度的代码
Jan 06 Javascript
jQuery实现长文字部分显示代码
May 13 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
Jul 04 Javascript
jquery 页面滚动到指定DIV实现代码
Sep 25 Javascript
php中给js数组赋值方法
Mar 10 Javascript
限制只能输入数字的实现代码
May 16 Javascript
bootstrap中模态框、模态框的属性实例详解
Feb 17 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
Aug 14 jQuery
vue移动端监听滚动条高度的实现方法
Sep 03 Javascript
Layui数据表格 前后端json数据接收的方法
Sep 19 Javascript
Vue切换div显示隐藏,多选,单选代码解析
Jul 14 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
Oct 25 #Javascript
代码整洁之道(重构)
Oct 25 #Javascript
Vue使用NPM方式搭建项目
Oct 25 #Javascript
小程序云开发实战小结
Oct 25 #Javascript
vue使用原生js实现滚动页面跟踪导航高亮的示例代码
Oct 25 #Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
Oct 25 #Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
Oct 25 #Javascript
You might like
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
yii框架配置默认controller和action示例
2014/04/30 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
html5+javascript实现简单上传的注意细节
2016/04/18 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
简单实现轮播图效果的实例
2016/07/15 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
详解Angular 4.x Injector
2017/05/04 Javascript
React全家桶环境搭建过程详解
2018/05/18 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
2018/09/03 Javascript
javascript实现文本框标签验证的实例代码
2018/10/14 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
Python字符串详细介绍
2015/05/09 Python
浅谈python为什么不需要三目运算符和switch
2016/06/17 Python
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
python求最大值最小值方法总结
2019/06/25 Python
python打开使用的方法
2019/09/30 Python
Python利用PyPDF2库获取PDF文件总页码实例
2020/04/03 Python
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
会计助理的岗位职责
2013/11/29 职场文书
《匆匆》教学反思
2014/02/22 职场文书
党课培训主持词
2014/04/01 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
酒店餐厅2014重阳节活动策划方案
2014/09/16 职场文书
幼儿园小班个人工作总结
2015/02/12 职场文书
nginx对http请求处理的各个阶段详析
2021/03/31 Servers
MySQL 覆盖索引的优点
2021/05/19 MySQL