create-react-app修改为多页面支持的方法


Posted in Javascript onMay 17, 2018

新公司前端就我一个,目前个人选型用react作技术栈开发前端h5页面。最近做一个需求是pc页面需要seo的,后端是Java开发,又不想自己用ssr做seo渲染,只好写html给java大神改成jsp了。然而这个又需要搞一套工作流太麻烦(太懒了),所以直接拿来create-react-app的工作流进行修改了。附上Git地址。

修改dev流程

在已经通过create-react-app生成项目的基础下yarn run eject

yarn add globby 用于查看html文件

修改config/paths.js

//遍历public下目录下的html文件生成arry
const globby = require('globby');
const htmlArray = globby.sync([path.join(resolveApp('public'), '/*.html')]);
//module.exports 里面增加
htmlArray

修改config/webpack.config.dev.js

<!--增加配置-->

// 遍历html
const entryObj = {};
const htmlPluginsAray = paths.htmlArray.map((v)=> {
 const fileParse = path.parse(v);
 
 entryObj[fileParse.name] = [
  require.resolve('./polyfills'),
  require.resolve('react-dev-utils/webpackHotDevClient'),
  `${paths.appSrc}/${fileParse.name}.js`,,
 ]
 return new HtmlWebpackPlugin({
  inject: true,
  chunks:[fileParse.name],
  template: `${paths.appPublic}/${fileParse.base}`,
  filename: fileParse.base
 })
});
<!--entry 替换为entryObj-->
entry:entryObj
<!--替换htmlplugin内容-->
// new HtmlWebpackPlugin({
//  inject: true,
//  chunks: ["index"],
//  template: paths.appPublic + '/index.html',
// }),
...htmlPluginsAray,

修改config/webpackDevServer.config.js

// 增加
const path = require('path');

const htmlPluginsAray = paths.htmlArray.map((v)=> {
 const fileParse = path.parse(v);
 return {
  from: new RegExp(`^\/${fileParse.base}`), to: `/build/${fileParse.base}`
 };
});
<!--historyApiFallback 增加 rewrites-->
rewrites: htmlPluginsAray

以上就是dev模式下的修改了,yarn start一下试试。

修改product流程

修改config/

//增加
// 遍历html
const entryObj = {};
const htmlPluginsAray = paths.htmlArray.map((v)=> {
 const fileParse = path.parse(v);
 
 entryObj[fileParse.name] = [
  require.resolve('./polyfills'),
  `${paths.appSrc}/${fileParse.name}.js`,
 ];
 console.log(v);
 return new HtmlWebpackPlugin({
  inject: true,
  chunks:[fileParse.name],
  template: `${paths.appPublic}/${fileParse.base}`,
  filename: fileParse.base
 })
});
<!--修改entry-->
 entry: entryObj,
<!--替换 new HtmlWebpackPlugin 这个值-->
...htmlPluginsAray,

增加复制模块(yarn add cpy

修改scripts/build.js

// function copyPublicFolder () 替换
// 原来的方法是复制public下所有的内容,因为增加了多html 所以不再直接复制过去(直接复制会覆盖html)
const copyPublicFolder = async() => {
 await cpy([`${paths.appPublic}/*.*`, `!${paths.appPublic}/*.html`], paths.appBuild);
 console.log('copy success!');
 // fs.copySync(paths.appPublic, paths.appBuild, {
 //  dereference: true,
 //  filter: file => file !== paths.appHtml,
 // });
}

以上修改后测试下yarn build

查看下html对应生成对不对,正常是OK的。

增加功能

sass支持(此参考create-react-app的文档,注意不要直接复制文档里面的"start": "react-scripts start", "build": "react-scripts build",因为我们前面已经yarn eject,所以这样用的话是有问题的可以自行体验一下)

// 增加模块
yarn add node-sass-chokidar npm-run-all
// package.json删除配置
"start": "node scripts/start.js",
"build": "node scripts/build.js",
// package.json里面增加scripts
"build-css": "node-sass-chokidar src/scss -o src/css",
"watch-css": "npm run build-css && node-sass-chokidar src/scss -o src/css --watch --recursive",
"start-js": "node scripts/start.js",
"start": "npm-run-all -p watch-css start-js",
"build-js": "node scripts/build.js",
"build": "npm-run-all build-css build-js",

html引入模块

yarn add html-loader
<!--index.html-->
<%= require('html-loader!./partials/header.html') %>

html里可以写img支持打包到build,如果不写的话是无法打包的,除非你在js里面require

<img src="<%= require('../src/imgs/phone.png') %>" alt="">

后面还要取消hash之类的配置,这个就不记录了。

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

Javascript 相关文章推荐
JavaScript 自动完成脚本整理(33个)
Oct 20 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
Oct 22 Javascript
最丑的时钟效果!js canvas时钟制作方法
Aug 15 Javascript
使用Math.max,Math.min获取数组中的最值实例
Apr 25 Javascript
react-native fetch的具体使用方法
Nov 01 Javascript
vue项目中v-model父子组件通信的实现详解
Dec 10 Javascript
Vue-cli项目获取本地json文件数据的实例
Mar 07 Javascript
解决vue热替换失效的根本原因
Sep 19 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
Apr 04 Javascript
基于javascript的拖拽类封装详解
Apr 19 Javascript
Vue动态修改网页标题的方法及遇到问题
Jun 09 Javascript
Vue实现仿iPhone悬浮球的示例代码
Mar 13 Javascript
vue 不使用select实现下拉框功能(推荐)
May 17 #Javascript
微信小程序自定义多选事件的实现代码
May 17 #Javascript
vue 标签属性数据绑定和拼接的实现方法
May 17 #Javascript
JS实现的判断方法、变量是否存在功能示例
Mar 28 #Javascript
vue 路由嵌套高亮问题的解决方法
May 17 #Javascript
JS实现字符串中去除指定子字符串方法分析
May 17 #Javascript
结合Vue控制字符和字节的显示个数的示例
May 17 #Javascript
You might like
图书管理程序(三)
2006/10/09 PHP
PHP学习笔记之二 php入门知识
2011/01/12 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
php源码之将图片转化为data/base64数据流实例详解
2016/11/27 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
jQuery 局部div刷新和全局刷新方法总结
2016/10/05 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
微信小程序 冒泡事件原理解析
2019/09/27 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
澳大利亚最便宜的网上药房:Chemist Warehouse
2020/01/30 全球购物
生产厂厂长岗位职责
2013/12/25 职场文书
马云的职业生涯规划之路
2014/01/01 职场文书
写给老师的表扬信
2014/01/21 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
爱之链教学反思
2014/04/30 职场文书
团队激励口号
2014/06/06 职场文书
优秀党员自我评价范文
2014/09/15 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
MySQL的安装与配置详细教程
2021/06/26 MySQL
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL