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
js左右弹性滚动对联广告代码分享
Feb 19 Javascript
javascript时间函数大全
Jun 30 Javascript
js实现文字跟随鼠标移动而移动的方法
Feb 28 Javascript
利用Angularjs和bootstrap实现购物车功能
Aug 31 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
Sep 05 Javascript
JavaScript学习笔记整理_setTimeout的应用
Sep 19 Javascript
bootstrap监听滚动实现头部跟随滚动
Nov 08 Javascript
js图片轮播插件的封装
Jul 21 Javascript
EasyUI在Panel上动态添加LinkButton按钮
Aug 11 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
Jan 31 Javascript
原生js实现的观察者和订阅者模式简单示例
Apr 18 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的curl开启问题探讨
2014/04/08 PHP
php中error与exception的区别及应用
2014/07/28 PHP
实例讲解yii2.0在php命令行中运行的步骤
2015/12/01 PHP
PHP中Array相关函数简介
2016/07/03 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
JavaScript 中的事件教程
2007/04/05 Javascript
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
2016/05/12 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
基于Vue框架vux组件库实现上拉刷新功能
2017/11/28 Javascript
Vue.js添加组件操作示例
2018/06/13 Javascript
python实现迭代法求方程组的根过程解析
2019/11/25 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
学习python (1)
2006/10/31 Python
Python实现提取谷歌音乐搜索结果的方法
2015/07/10 Python
python 实时遍历日志文件
2016/04/12 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
基于pandas数据样本行列选取的方法
2018/04/20 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
python deque模块简单使用代码实例
2020/03/12 Python
在Tensorflow中实现leakyRelu操作详解(高效)
2020/06/30 Python
python中操作文件的模块的方法总结
2021/02/04 Python
Notino意大利:购买香水和化妆品
2018/11/14 全球购物
工商管理系学生的自我评价分享
2013/11/29 职场文书
高中军训感言400字
2014/02/24 职场文书
党的群众路线教育实践方案
2014/05/11 职场文书
安全员岗位职责范本
2015/04/11 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
ant design charts 获取后端接口数据展示
2022/05/25 Javascript