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 动态调整图片尺寸实现代码
Dec 28 Javascript
ASP 过滤数组重复数据函数(加强版)
May 31 Javascript
javascript中的onkeyup和onkeydown区别介绍
Apr 28 Javascript
js、css、img等浏览器缓存问题的2种解决方案
Oct 23 Javascript
JavaScript前补零操作实例
Mar 11 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
Mar 13 Javascript
基于Jquery和html5的7款个性化地图插件
Nov 17 Javascript
JS使用JSON作为参数实例分析
Jun 23 Javascript
JavaScript实现动态添加Form表单元素的方法示例
Aug 14 Javascript
vue cli2.0单页面title修改方法
Jun 07 Javascript
es6数值的扩展方法
Mar 11 Javascript
ES6中的Javascript解构的实现
Oct 30 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,不用COM,生成excel文件
2006/10/09 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
面向对象的javascript(笔记)
2009/10/06 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
window.opener用法和用途实例介绍
2013/08/19 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
Vue中CSS动画原理的实现
2019/02/13 Javascript
python检测某个变量是否有定义的方法
2015/05/20 Python
分享一个简单的python读写文件脚本
2017/11/25 Python
python 获取等间隔的数组实例
2019/07/04 Python
python3-flask-3将信息写入日志的实操方法
2019/11/12 Python
python路径的写法及目录的获取方式
2019/12/26 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
使用Keras中的ImageDataGenerator进行批次读图方式
2020/06/17 Python
解决Python安装cryptography报错问题
2020/09/03 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
英国泰坦旅游网站:全球陪同游览,邮轮和铁路旅行
2016/11/29 全球购物
乌克兰电子和家用电器商店:Foxtrot
2019/07/23 全球购物
学生发电厂实习自我鉴定
2013/09/22 职场文书
物流专业大学应届生求职信
2013/11/03 职场文书
大学生求职推荐信
2013/11/27 职场文书
促销活动计划书
2014/05/02 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
2014教师年度思想工作总结
2014/11/10 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis
利用Python实现模拟登录知乎
2022/05/25 Python