首页 > 编程语言 >将带有 ExpressJS 后端的 React 应用程序从 Heroku 迁移到 Netlify

将带有 ExpressJS 后端的 React 应用程序从 Heroku 迁移到 Netlify

时间:2022-09-23 11:58:38浏览次数:120  
标签:node ExpressJS Netlify 应用程序 React netlify Heroku fetch

将带有 ExpressJS 后端的 React 应用程序从 Heroku 迁移到 Netlify

Photo by 克里斯布里格斯 on 不飞溅

Heroku 将开始对 Heroku Dynos 收费,这是运行节点服务器所需的资源。如果您正在开发具有前端和后端的全栈应用程序,则需要升级到付费层或迁移到另一个 Web 平台。

Netlify 是市场上提供慷慨免费等级帐户的最佳选择之一。

但是 Netlify 的后端服务与使用 serverless 功能的 Heroku 有很大不同。不能直接使用相同的后端代码库。

但是只需几个简单的步骤,同一个 React 应用程序就可以立即启动并运行!

从 Heroku 迁移到 Netlify 的步骤

  1. 安装 netlify-lambda无服务器-http

    npm --i netlify-lambda serverless-http

2.在 服务器 目录:

  • 创建一个空 功能 目录——node.js/express 服务器的原始 js/ts 文件默认会内置到“functions”文件夹中

  • 创建一个 源代码 放置后端文件的目录

  • 创建一个 距离 放置所有前端构建文件(HTML、CSS 和 JS)的目录

  • 创建一个 netlify.thumb 文件(详情如下)

  • 更新 包.json 脚本(详情如下)

  • gitignore 以下目录

    节点模块
    功能

3. 修改后端文件(详情如下)

4.将前端应用中的API端点更新为如下路径(默认)

**/.netlify/functions/[文件名]**

您最终将或多或少地得到以下文件结构:

5. 将您的更改推送到在线存储库(例如 github),然后连接到 Netlify 以开始部署您的 Web 应用程序

恭喜!您的应用程序再次免费启动并运行!

netlify.thumb

此文件可用于配置 Netlify 服务器的构建设置、部署设置和环境变量。

至少,我们需要指定两种配置:

  1. 要放入“functions”目录的函数

  2. 将对静态文件的所有请求重定向到允许客户端路由的网站根目录(即使用 React-router 等)

    [建造]
    功能=“功能” [[重定向]]
    来自 = "/*"
    至 = "/"
    状态 = 200

阅读有关 netlify.toml 的更多信息

包.json

不是直接从 Node.js 运行,而是需要模拟该函数以在 Netlify Lambda 上运行,因此我们需要将脚本更改为:

 “脚本”:{ “开始”:“./node_modules/.bin/netlify-lambda 服务源代码”,  
 “构建”:“./node_modules/.bin/netlify-lambda 构建 src” }

更改后端文件

以下是 API 端点的后端文件的基本框架,其文件名 api.js

 常量表达 = 要求(“表达”);  
 常量路由器 = express.Router()  
 **const serverless = require("serverless-http");** 常量应用程序 = 快递(); app.use(express.json()); app.use(/.netlify/functions/ **接口"** ,路由器); router.get("/test", (request, response) => {  
 返回响应。发送(“你好”);  
 }); **module.exports = 应用程序;  
 module.exports.handler = serverless(app);**

端点 /.netlify/functions/api/test 将返回“你好”

常见问题:Node.js 错误

如果您遇到以下错误:

 节点:内部/加密/哈希:71  
 this[kHandle] = new _Hash(算法, xofLen);  
 ^ **错误:错误:0308010C:数字信封例程::不支持**

原因是您正在运行具有更新的 openssl 要求的最新版本的 Node。在这种情况下,您需要将脚本更改为:

 “脚本”:{ "start": "NODE_OPTIONS= - openssl-legacy-provider ./node_modules/.bin/netlify-lambda 服务 src",  
 “构建”:“./node_modules/.bin/netlify-lambda 构建 src” }

常见问题:fetch、node-fetch 和 axios

到目前为止,Netlify 上的 lambda 函数仍未运行本机 javascript fetch 函数。即使您可以在本地环境中毫无问题地运行它,Netlify 的边缘服务器也会抱怨 'fetch' 未定义。

一个流行的替代方案是提供 javascript 提取功能的“node-fetch”模块。但是,node-fetch 2.6 和 node-fetch 3.X 都不适用于 Netlify。你会得到一些奇怪的错误,比如:

 类型错误:e 不是函数  
 类型错误:c 不是函数

这与 Webpack 和 Babel 配置有关。但是解决这个问题的一种简单方法是利用 axios 模块。

只需安装 axios 库并将所有 fetch 更改为 axios 即可。

 fetch(URL, { method: "Get" }).then(...) => axios.get(URL).then(...)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/38856/44142311

标签:node,ExpressJS,Netlify,应用程序,React,netlify,Heroku,fetch
From: https://www.cnblogs.com/amboke/p/16722210.html

相关文章

  • React 受控组件和非受控组件
    受控组件在HTML中,表单元素的标签<input>、<textarea>、<select>等的值改变通常是根据用户输入进行更新。而在React中,这些输入表单元素的值,应该保存在state中,并且只能由se......
  • react-native 实现环形(圆形)进度条
    废话不多说,直接上硬货:效果图   安装 react-native-anchor-point用于处理旋转中心点位置yarnaddreact-native-anchor-pointgithub仓库地址: https://github......
  • rxjs 在 react 下的应用
    设置一个subject,然后在组件内定义一个subscription想要发送事件就用subject.next订阅就赋值subject.asObservable().subscribe()直接看代码constsubject=ne......
  • 快速上手React编程 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1R4B-izNpESydo-yFNmU8xw点击这里获取提取码 ......
  • 教你如何实现react Scheduler(二)
    在上一篇文章中“反应调度程序(1)”中,我们使用MessageChannel来实现一个简单的任务调度功能。但是这个功能目前还是比较简单的,现在我们来改进一下,给任务增加优先级和过期......
  • 使用 PNPM 将 React App 中的磁盘空间减少 60%
    使用PNPM将ReactApp中的磁盘空间减少60%在React应用程序中使用PNPM减少磁盘空间的教程。Photoby诺德伍德主题on不飞溅您是否正在处理具有共同依赖项的......
  • React + Eartho 与 3 个简单的步骤集成
    React+Eartho与3个简单的步骤集成如果您已经关注并访问了您的第一个地球和React经验,那么我相信你会感觉很棒。它一次为开发人员提供了许多好处。如果你有地球......
  • React 组件和更好的方法
    React组件和更好的方法Credits-eduba.com想了解react.js如何帮助创建令人惊叹的用户界面?它是如何让我们如此轻松高效地执行多项任务的?在本文中,我将介绍其中一个Re......
  • vue3中watch监听ref reactive响应式数据写法及注意点
    watch函数与vue2中watch配置一致两个小坑监视reactive定义的响应式数据时,oldvalue无法正确获取,强制开启了深度监视(deep配置失败)监视reactive定义的响应式数据中某个......
  • 写给自己的react面试题总结
    解释React中render()的目的。每个React组件强制要求必须有一个render()。它返回一个React元素,是原生DOM组件的表示。如果需要渲染多个HTML元素,则必须将它们组......