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字符编码函数区别分析
Jun 05 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
Apr 11 Javascript
jQuery EasyUI datagrid实现本地分页的方法
Feb 13 Javascript
基于JavaScript FileReader上传图片显示本地链接
May 27 Javascript
Bootstrap实现弹性搜索框
Jul 11 Javascript
AngulerJS学习之按需动态加载文件
Feb 13 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
Dec 07 Javascript
JS数组去重常用方法实例小结【4种方法】
May 28 Javascript
Vue2.0点击切换类名改变样式的方法
Aug 22 Javascript
bootstrap table实现合并单元格效果
Dec 24 Javascript
vue Tab切换以及缓存页面处理的几种方式
Nov 05 Javascript
国内常用的js类库大全(CDN公共库)
Jun 24 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
在PHP里得到前天和昨天的日期的代码
2007/08/16 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
PHP PDO数据库操作预处理与注意事项
2019/03/16 PHP
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
jquery.validate使用攻略 第一部
2010/07/01 Javascript
Javascript的并行运算实现代码
2010/11/19 Javascript
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
简谈创建React Component的几种方式
2019/06/15 Javascript
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
[43:36]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python实现网站文件的全备份和差异备份
2014/11/30 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
Python用SSH连接到网络设备
2021/02/18 Python
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
艺术用品:Arteza
2018/11/25 全球购物
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
境外导游求职信
2014/02/27 职场文书
商场父亲节活动方案
2014/08/27 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
父亲节感言
2015/08/03 职场文书
git中cherry-pick命令的使用教程
2022/06/25 Servers