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 相关文章推荐
IE8 浏览器Cookie的处理
Jan 31 Javascript
jquery 追加tr和删除tr示例代码
Sep 12 Javascript
使用JavaScript链式编程实现模拟Jquery函数
Dec 21 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
Aug 05 Javascript
jQuery点击输入框显示验证码图片
May 19 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
Jul 21 Javascript
javascript比较语义化版本号的实现代码
Sep 09 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
Dec 08 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
Apr 01 Javascript
深入理解JavaScript继承的多种方式和优缺点
May 12 Javascript
vue 项目 iOS WKWebView 加载
Apr 17 Javascript
详解node和ES6的模块导出与导入
Feb 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和网页显示乱码解决方法集锦
2008/03/27 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
javascript批量修改文件编码格式的方法
2015/01/27 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
jQuery实现鼠标滑过点击事件音效试听
2015/08/31 Javascript
js实现简单排列组合的方法
2016/01/27 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
2021/01/03 Vue.js
Python实现自动登录百度空间的方法
2017/06/10 Python
python 平衡二叉树实现代码示例
2018/07/07 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
python paramiko远程服务器终端操作过程解析
2019/12/14 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
python对一个数向上取整的实例方法
2020/06/18 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
团员学习总结的自我评价范文
2013/10/14 职场文书
精彩的推荐信范文
2013/11/26 职场文书
采购主管工作职责
2013/12/12 职场文书
马云的职业生涯规划之路
2014/01/01 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
婚礼答谢词
2015/01/04 职场文书
工作简报格式范文
2015/07/21 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
Java由浅入深通关抽象类与接口(上篇)
2022/04/26 Java/Android