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 相关文章推荐
Mootools 1.2教程 设置和获取样式表属性
Sep 15 Javascript
javascript实现的像java、c#之类的sleep暂停的函数代码
Mar 04 Javascript
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
Jul 26 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
Jun 05 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
Dec 16 Javascript
推荐10 款 SVG 动画的 JavaScript 库
Mar 24 Javascript
jQuery实现简单的网页换肤效果示例
Sep 18 Javascript
Angular2学习笔记——详解路由器模型(Router)
Dec 02 Javascript
关于laydate.js加载laydate.css路径错误问题解决
Dec 27 Javascript
vue本地打开build后生成的dist文件夹index.html问题
Sep 04 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
Nov 01 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
Jul 19 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
新版mysql+apache+php Linux安装指南
2006/10/09 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
Composer设置忽略版本匹配的方法
2016/04/27 PHP
[原创]PHP字符串中插入子字符串方法总结
2016/05/06 PHP
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
js操作select控件的几种方法
2010/06/02 Javascript
JS 表单验证大全
2011/11/23 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
JavaScript变量声明详解
2014/11/27 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
2015/09/09 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
2019/08/09 Javascript
Vue路由模块化配置的完整步骤
2019/08/14 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
Python文件及目录操作实例详解
2015/06/04 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
J2EE面试题大全
2016/08/06 面试题
大学生职业生涯规划范文
2014/01/22 职场文书
客服部工作职责范本
2014/02/14 职场文书
我的中国梦演讲稿800字
2014/08/19 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
2014年移动公司工作总结
2014/12/08 职场文书
六五普法学习心得体会
2016/01/21 职场文书
合同补充协议书
2016/03/24 职场文书
logback 实现给变量指定默认值
2021/08/30 Java/Android
PYTHON 使用 Pandas 删除某列指定值所在的行
2022/04/28 Python
Django框架之路由用法
2022/06/10 Python
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript