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验证邮箱格式是否正确的代码
Dec 05 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
Dec 16 Javascript
使用POST方式弹出窗口的两种方法示例介绍
Jan 29 Javascript
js判断页面中是否有指定控件的简单实例
Mar 04 Javascript
js实现三张图(文)片一起切换的banner焦点图
Aug 25 Javascript
跨域资源共享 CORS 详解
Apr 26 Javascript
Vue实现双向数据绑定
May 03 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
Jul 19 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
Sep 29 Javascript
Vue中的作用域CSS和CSS模块的区别
Oct 09 Javascript
vue监听用户输入和点击功能
Sep 27 Javascript
JavaScript控制台的更多功能
Apr 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
PHP 的几个配置文件函数
2006/12/21 PHP
PHP下常用正则表达式整理
2010/10/26 PHP
php的curl封装类用法实例
2014/11/07 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
setAttribute 与 class冲突解决
2008/02/17 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
理解javascript异步编程
2016/01/27 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
vuex如何重置所有state(可定制)
2019/01/17 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
Python编程中对文件和存储器的读写示例
2016/01/25 Python
使用Selenium破解新浪微博的四宫格验证码
2018/10/19 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
医院总经理岗位职责
2014/02/04 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
会计求职信怎么写
2015/03/20 职场文书
同事去世追悼词
2015/06/23 职场文书