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 相关文章推荐
如何实现JS函数的重载
Sep 22 Javascript
Javascript 事件流和事件绑定
Jul 16 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
Nov 04 Javascript
基于JavaScript自定义构造函数的详解说明
Apr 24 Javascript
当前流行的JavaScript代码风格指南
Sep 10 Javascript
C#微信小程序服务端获取用户解密信息实例代码
Mar 10 Javascript
Angular实现的table表格排序功能完整示例
Dec 22 Javascript
mpvue构建小程序的方法(步骤+地址)
May 22 Javascript
如何对react hooks进行单元测试的方法
Aug 14 Javascript
详解element-ui中表单验证的三种方式
Sep 18 Javascript
React 父子组件通信的实现方法
Dec 05 Javascript
构建一个JavaScript插件系统
Oct 20 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者的疑难问答(1)
2006/10/09 PHP
PHP中的日期及时间
2006/11/23 PHP
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
php float不四舍五入截取浮点型字符串方法总结
2013/10/28 PHP
PHP实现单例模式最安全的做法
2014/06/13 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
JS将制定内容复制到剪切板示例代码
2014/02/11 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
基于JavaScript实现智能右键菜单
2016/03/02 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
详解用函数式编程对JavaScript进行断舍离
2017/09/18 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
Vue.js实现列表清单的操作方法
2017/11/15 Javascript
jquery学习笔记之无new构建详解
2017/12/07 jQuery
vue 点击按钮实现动态挂载子组件的方法
2018/09/07 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
Vue-cli3简单使用(图文步骤)
2019/04/30 Javascript
如何获取vue单文件自身源码路径
2019/05/06 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
Python牛刀小试密码爆破
2011/02/03 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
求职简历自我评价范例
2014/03/12 职场文书
农村产权制度改革实施方案
2014/03/21 职场文书
公司仓库管理制度
2015/08/04 职场文书
培训心得体会怎么写
2016/01/25 职场文书
python中的被动信息搜集
2021/04/29 Python
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android