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 相关文章推荐
javascript和HTML5利用canvas构建猜牌游戏实现算法
Jul 17 Javascript
JavaScript 实现鼠标拖动元素实例代码
Feb 24 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
Dec 14 Javascript
一个简单的JavaScript Map实例(分享)
Aug 03 Javascript
js实现select选择框效果及美化
Aug 19 Javascript
jQuery日程管理插件fullcalendar使用详解
Jan 07 Javascript
JQuery判断正整数整理小结
Aug 21 jQuery
深入剖析Node.js cluster模块
May 23 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
Oct 11 Javascript
vue 项目地址去掉 #的方法
Oct 20 Javascript
微信小程序性能优化之checkSession的使用
Mar 06 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
Apr 21 Javascript
原生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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
php利用cookie实现访问次数统计代码
2011/05/19 PHP
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
php 中文字符串首字母的获取函数分享
2013/11/04 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
可以文本显示的公告栏的js代码
2007/03/11 Javascript
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
javascript 多浏览器 事件大全
2010/03/23 Javascript
js解析与序列化json数据(二)序列化探讨
2013/02/01 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
2017/12/01 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
在Express中提供静态文件的实现方法
2019/10/17 Javascript
javscript 数组扁平化的实现
2020/02/03 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
python利用微信公众号实现报警功能
2018/06/10 Python
Python3 Tkinter选择路径功能的实现方法
2019/06/14 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
详解python UDP 编程
2020/08/24 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
美国网上购买眼镜:Eyeconic
2017/07/29 全球购物
英语专业学子个人的自我评价
2013/10/02 职场文书
会计电算化应届生求职信
2013/11/03 职场文书
小学语文课后反思精选
2014/04/25 职场文书
党课主持词大全
2015/06/30 职场文书
春节随笔
2015/08/15 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript