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 相关文章推荐
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
Oct 12 Javascript
js去除重复字符串两种实现方法
Jan 09 Javascript
JavaScript实现点击单元格改变背景色的方法
Feb 12 Javascript
理解javascript定时器中的setTimeout与setInterval
Feb 23 Javascript
自动完成的搜索框javascript实现
Feb 26 Javascript
JS定义类的六种方式详解
May 12 Javascript
JavaScript数据结构之二叉树的计数算法示例
Apr 13 Javascript
详解Javascript获取缓存和清除缓存API
May 25 Javascript
Node中使用ES6语法的基础教程
Jan 05 Javascript
node前端开发模板引擎Jade的入门
May 11 Javascript
微信浏览器左上角返回按钮监听的实现
Mar 04 Javascript
Echarts.js无法引入问题解决方案
Oct 30 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
QueryPath PHP 中的jQuery
2010/04/11 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
php中文繁体和简体相互转换的方法
2015/03/21 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
js的toLowerCase方法用法实例
2015/01/27 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
javascript实现可键盘控制的抽奖系统
2016/03/10 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
原生JS实现图片轮播效果
2016/12/26 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
微信小程序动态增加按钮组件
2018/09/14 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
Echart折线图手柄触发事件示例详解
2018/12/16 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
2019/03/07 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
小小聊天室Python代码实现
2016/08/17 Python
对python中的six.moves模块的下载函数urlretrieve详解
2018/12/19 Python
python设置环境变量的作用和实例
2019/07/09 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
python数字图像处理:图像的绘制
2022/06/28 Python