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第一课
Feb 27 Javascript
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
Nov 23 Javascript
异步javascript的原理和实现技巧介绍
Nov 08 Javascript
javascript实现可改变滚动方向的无缝滚动实例
Jun 17 Javascript
js导出格式化的excel 实例方法
Jul 17 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
May 26 Javascript
canvas实现图像布局填充功能
Feb 06 Javascript
jquery操作select取值赋值与设置选中实例
Feb 28 Javascript
jquery ui sortable拖拽后保存位置
Apr 27 jQuery
使用clipboard.js实现复制功能的示例代码
Oct 16 Javascript
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
Apr 08 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
May 28 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
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
2008/03/28 PHP
PHP使用正则表达式清除超链接文本
2013/11/12 PHP
PHP中list方法用法示例
2016/12/01 PHP
取得父标签
2006/11/14 Javascript
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
基于jsTree的无限级树JSON数据的转换代码
2010/07/27 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
移动设备手势事件库Touch.js使用详解
2017/08/18 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
p5.js入门教程之键盘交互
2018/03/19 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
JS前端模块化原理与实现方法详解
2020/03/17 Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
2020/05/08 Javascript
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
python中sets模块的用法实例
2014/09/30 Python
Python实现测试磁盘性能的方法
2015/03/12 Python
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
Python面向对象编程之继承与多态详解
2018/01/16 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
怎样自定义一个异常类
2016/09/27 面试题
优秀学生干部推荐材料
2014/02/03 职场文书
《口技》教学反思
2014/02/21 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
食品安全承诺书范文
2014/08/29 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
异地恋情人节寄语
2015/02/28 职场文书
银行服务理念口号
2015/12/25 职场文书
总结Python常用的魔法方法
2021/05/25 Python
Java基础之this关键字的使用
2021/06/30 Java/Android