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判断录入的日期是否合法
Jan 08 Javascript
setTimeout内不支持jquery的选择器的解决方案
Apr 28 Javascript
jquery实现的仿天猫侧导航tab切换效果
Aug 24 Javascript
归纳下js面向对象的几种常见写法总结
Aug 24 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
Aug 30 Javascript
使用BootStrapValidator完成前端输入验证
Sep 28 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
Jan 05 Javascript
jQuery倒计时代码(超简单)
Feb 27 Javascript
Vue实现自定义下拉菜单功能
Jul 16 Javascript
微信小程序实现随机验证码功能
Dec 20 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
Mar 04 Javascript
如何实现js拖拽效果及原理解析
May 08 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
PHP日期处理函数 整型日期格式
2011/01/12 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
Jquery多选框互相内容交换的实例代码
2013/07/04 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
2013/11/21 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
微信小程序 教程之模板
2016/10/18 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
2020/08/05 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
跟老齐学Python之网站的结构
2014/10/24 Python
Python访问MySQL封装的常用类实例
2014/11/11 Python
python使用PIL缩放网络图片并保存的方法
2015/04/24 Python
python对url格式解析的方法
2015/05/13 Python
Python File(文件) 方法整理
2019/02/18 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
详解python中的异常捕获
2020/12/15 Python
前端隐藏出边界内容的实现方法
2016/04/14 HTML / CSS
自我推荐书
2013/12/04 职场文书
护理专业学生的求职信范文
2013/12/11 职场文书
小区文明倡议书
2014/05/16 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
教师纪念9.18事件演讲稿范文
2014/09/14 职场文书
群众路线自我剖析及整改措施
2014/11/04 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
Redis Cluster集群动态扩容的实现
2021/07/15 Redis