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 相关文章推荐
在jQuery 1.5中使用deferred对象的代码(翻译)
Mar 10 Javascript
javascript模拟select,jselect的方法实现
Nov 08 Javascript
浅谈JavaScript function函数种类
Dec 29 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
Mar 23 Javascript
jQuery插件datalist实现很好看的input下拉列表
Jul 14 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
Oct 01 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
May 03 Javascript
js判断浏览器是否支持严格模式的方法
Oct 04 Javascript
微信小程序 animation API详解及实例代码
Oct 08 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
Nov 14 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
Mar 21 Javascript
jquery插件实现悬浮的菜单
Apr 24 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
第十一节 重载 [11]
2006/10/09 PHP
PHP中Date获取时间不正确怎么办
2008/06/05 PHP
PHP Stream_*系列函数
2010/08/01 PHP
php的memcache类分享(memcache队列)
2014/03/26 PHP
php中各种定义变量的方法小结
2017/10/18 PHP
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
用于deeplink的js方法(判断手机是否安装app)
2014/04/02 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
2016/05/21 Javascript
node.js cookie-parser之parser.js
2016/06/06 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
js学使用setTimeout实现轮循动画
2017/07/17 Javascript
jQuery实现的鼠标滚轮控制图片缩放功能实例
2017/10/14 jQuery
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
2019/11/15 Javascript
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
使用Django和Python创建Json response的方法
2018/03/26 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
Python图像处理库PIL的ImageGrab模块介绍详解
2020/02/26 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
Python实现京东抢秒杀功能
2021/01/25 Python
css3 flex布局 justify-content:space-between 最后一行左对齐
2020/01/02 HTML / CSS
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
Yahoo-PHP面试题1
2016/07/20 面试题
入党自我评价范文
2014/02/02 职场文书
工商行政管理专业求职书
2014/05/23 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
2014年个人业务工作总结
2014/11/17 职场文书