react项目从新建到部署的实现示例


Posted in Javascript onFebruary 19, 2021

开展新项目

本文主要记录最近工作一个新项目从0-1的过程,主要记录3个节点,选型、运行时、上线。

项目选型

react 脚手架初始化,社区比较火的有cra(create-react-app)和umi,从以下几点进行对比最终选择了比较贴合项目的umi。

  1. 易用性,开箱即用。umi内置了许多功能,可是也带来很多限制,譬如对项目结构的规定提供自己生态的插件需要学习成本,cra初始化简洁选取模板即可开始,不需要额外的学习成本(即使vue玩家过来也没负担)。
  2. 可拓展性,修改webpack配置。cra提供eject(不可逆的操作)全部暴露出来自己控制,丧失了一开始想要简单配置的初衷,或者使用react-app-rewired和customize-cra可看这里。 umi需要修改webpack配置时可直接写文件(基于webpack-chain),还提供了一个运行态的配置。
  3. 生态,umi是阿里开源的,里面有许多插件都与他们的开源关联起来了,比如比较火的antd,qiankun,官网提供了大量的实践指导,而且是中文文档(有部分人会倾向于此),cra简洁只负责一个脚手架的工作(容易理解内部实现,出问题能快速定位解决)。

最终考虑到一个项目需要快速搭建需要许多成型的插件支持所以采用了umi。antd真香!!!@umijs/plugin-model,推荐这个插件看懂内部实践基本就掌握了数据管理了。

运行时

umi提供app.ts,运行时配置文件,可以扩展运行时的能力,简单理解就是渲染你页面的前置操作都可以放在这里。这个概念可以类

比storybook(preview.js),如果要自己实现可以在对应html插入script。这里会涉及一些项目关联内容,因为项目需要内嵌在已有项目中,所以我们采取iframe的方式,不可避免我们需要通信,以及iframe大小自适应。

iframe通信,因为域不一样所以采取了,window.postmessage。为了维护数据可读性建议定义对应的事件传输内容,避免后期维护难度上升,如果需要频繁通信更建议采取微前端方案。

iframe自适应, iframe-resizer插件帮我们解决,记住嵌入与被嵌入的都需要安装,不然无法通信不可能自适应。这里遇到一个问题页面嵌入的时候body节点一直无法由内部撑大所以需要使用iframe-resizer提供的自定义计算方法自己在子页面提供对应方法。代码如下:

子系统

import 'iframe-resizer/js/iframeResizer.contentWindow.js';
// 如果内嵌则运行时打开监听
const iframeInit = () => {
 if (parent !== window) {
  (window as any).iFrameResizer = {
   heightCalculationMethod: () => {
    return document.body.children[0].clientHeight;
   },
  };
  window.onmessage = (event: any) => {
   if (Array.isArray(event.data)) {
    if (event.data[0] === '事件名') {
     console.log(event.data[1]) // 事件参数
    }
   }
  };
  parent.postMessage({ msg: 'MessageFromIframePage' }, '*');
 }
};

iframeInit();

上线

经过一轮打包,终于到了上线了。这里主要讲讲nginx怎么配置转发请求。

在开发期间,如果需要对多个不同域的接口时,前端第一个反应就是配置proxy。上线时就有点懵了。

proxy: {
  '/api': {
   target: 'http://aaa.com',
   changeOrigin: true,
   pathRewrite: { '^/api': '' },
  },
  '/b-api': {
   target: 'http://bbb.com/',
   changeOrigin: true,
   pathRewrite: { '^/b-api': '' },
  },
 },

nginx配置如下

server {
  listen 80;
  server_name 访问地址;
  set $rooturi "xxxx/dist";
  location ~ .*\.(jpg|jpeg|gif|png|webp|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|svg|proto)$ {
   expires 365d;
   root $rooturi;
  }
  location ^~/api/ {

   rewrite ^/api/(.*)$ /$1 break;
   proxy_pass http://aaa.com;
  }
  
  location ^~/b-api/ {

   rewrite ^/b-api/(.*)$ /$1 break;
   proxy_pass http://bbb.com;
  }
  
  location / {
   root $rooturi;
   try_files $uri $uri/ /index.html =404;
   add_header Cache-Control "no-cache";
   add_header Access-Control-Allow-Origin *;
  }

 
}

到此这篇关于react项目从新建到部署的实现示例的文章就介绍到这了,更多相关react 新建到部署内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
仿服务器端脚本方式的JS模板实现方法
Apr 27 Javascript
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
Oct 24 Javascript
如何获取网站icon有哪些可行的方法
Jun 05 Javascript
jQuery中:nth-child选择器用法实例
Dec 31 Javascript
js的window.showModalDialog及window.open用法实例分析
Jan 29 Javascript
DOM操作一些常用的属性汇总
Mar 13 Javascript
浅谈Javascript的静态属性和原型属性
May 07 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
Aug 11 Javascript
微信小程序 动态绑定事件并实现事件修改样式
Apr 13 Javascript
详解vue中router-link标签所必备了解的属性
Apr 15 Javascript
node实现爬虫的几种简易方式
Aug 22 Javascript
jQuery zTree如何改变指定节点文本样式
Oct 16 jQuery
原生JavaScript实现幻灯片效果
Feb 19 #Javascript
JavaScript 实现继承的几种方式
Feb 19 #Javascript
JavaScript 生成唯一ID的几种方式
Feb 19 #Javascript
JavaScript实现打字游戏
Feb 19 #Javascript
JS+CSS实现动态时钟
Feb 19 #Javascript
js动态添加带圆圈序号列表的实例代码
Feb 18 #Javascript
原生微信小程序开发中 redux 的使用详解
Feb 18 #Javascript
You might like
php动态生成JavaScript代码
2009/03/09 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
PHP通过正则表达式下载图片到本地的实现代码
2011/09/19 PHP
php实现将任意进制数转换成10进制的方法
2015/04/17 PHP
yii2中的rules 自定义验证规则详解
2016/04/19 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
2016/08/23 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
Vue插件之滑动验证码
2019/09/21 Javascript
python分治法求二维数组局部峰值方法
2018/04/03 Python
TensorFlow实现Logistic回归
2018/09/07 Python
Python subprocess库的使用详解
2018/10/26 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
python中with用法讲解
2020/02/07 Python
python 将html转换为pdf的几种方法
2020/12/29 Python
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
美国牛仔品牌:True Religion
2018/11/16 全球购物
一夜的工作教学反思
2014/02/08 职场文书
共产党员公开承诺书
2014/03/25 职场文书
师德师风自我评价范文
2014/09/11 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
班主任2015新年寄语
2014/12/08 职场文书
党课主持词大全
2015/06/30 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
SQL Server连接查询的实用教程
2021/04/07 SQL Server
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
MySQL5.7并行复制原理及实现
2021/06/03 MySQL
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript