【问题标题】:How to properly deploy ReactJS app as Azure web app如何将 ReactJS 应用程序正确部署为 Azure Web 应用程序
【发布时间】:2020-05-05 18:06:47
【问题描述】:

我正在尝试将使用 create-react-app 创建的 ReactJS 应用部署为 Azure Web 应用,但遇到了启动问题。

create-react-app 部署页面 (https://create-react-app.dev/docs/deployment/) 有一个部分介绍 Azure Web 应用程序,它只是指向这个中型博客 (https://medium.com/@strid/host-create-react-app-on-azure-986bc40d5bf2#.pycfnafbg)。这篇博客文章很有帮助,可能在某个时候有效,但不再有效。

博客中的做法是在 web 应用程序的存储库目录中运行构建,然后将构建文件夹的内容移动到 wwwroot。问题是构建文件夹不能通过简单地加载 index.html 来运行。它必须由

启动
serve -s build

我解决此问题的方法是 (1) 在 package.json 中添加“服务”作为依赖项,以及 (2) 在 Azure Web 应用程序中添加启动命令:

node ../repository/node_modules/serve/bin/serve.js -s .

它有效,但看起来像一个真正的 kluge。这样做的正确方法是什么?为了完整起见,这是我的 deploy.sh...

#!/bin/bash

# ----------------------
# KUDU Deployment Script
# Version: 1.0.17
# ----------------------

# Helpers
# -------

exitWithMessageOnError () {
  if [ ! $? -eq 0 ]; then
    echo "An error has occurred during web site deployment."
    echo $1
    exit 1
  fi
}

# Prerequisites
# -------------

# Verify node.js installed
hash node 2>/dev/null
exitWithMessageOnError "Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment."

# Setup
# -----

SCRIPT_DIR="${BASH_SOURCE[0]%\\*}"
SCRIPT_DIR="${SCRIPT_DIR%/*}"
ARTIFACTS=$SCRIPT_DIR/../artifacts
KUDU_SYNC_CMD=${KUDU_SYNC_CMD//\"}

if [[ ! -n "$DEPLOYMENT_SOURCE" ]]; then
  DEPLOYMENT_SOURCE=$SCRIPT_DIR
fi

if [[ ! -n "$NEXT_MANIFEST_PATH" ]]; then
  NEXT_MANIFEST_PATH=$ARTIFACTS/manifest

  if [[ ! -n "$PREVIOUS_MANIFEST_PATH" ]]; then
    PREVIOUS_MANIFEST_PATH=$NEXT_MANIFEST_PATH
  fi
fi

if [[ ! -n "$DEPLOYMENT_TARGET" ]]; then
  DEPLOYMENT_TARGET=$ARTIFACTS/wwwroot
else
  KUDU_SERVICE=true
fi

if [[ ! -n "$KUDU_SYNC_CMD" ]]; then
  # Install kudu sync
  echo Installing Kudu Sync
  npm install kudusync -g --silent
  exitWithMessageOnError "npm failed"

  if [[ ! -n "$KUDU_SERVICE" ]]; then
    # In case we are running locally this is the correct location of kuduSync
    KUDU_SYNC_CMD=kuduSync
  else
    # In case we are running on kudu service this is the correct location of kuduSync
    KUDU_SYNC_CMD=$APPDATA/npm/node_modules/kuduSync/bin/kuduSync
  fi
fi

# Node Helpers
# ------------

selectNodeVersion () {
  if [[ -n "$KUDU_SELECT_NODE_VERSION_CMD" ]]; then
    SELECT_NODE_VERSION="$KUDU_SELECT_NODE_VERSION_CMD \"$DEPLOYMENT_SOURCE\" \"$DEPLOYMENT_TARGET\" \"$DEPLOYMENT_TEMP\""
    eval $SELECT_NODE_VERSION
    exitWithMessageOnError "select node version failed"

    if [[ -e "$DEPLOYMENT_TEMP/__nodeVersion.tmp" ]]; then
      NODE_EXE=`cat "$DEPLOYMENT_TEMP/__nodeVersion.tmp"`
      exitWithMessageOnError "getting node version failed"
    fi

    if [[ -e "$DEPLOYMENT_TEMP/__npmVersion.tmp" ]]; then
      NPM_JS_PATH=`cat "$DEPLOYMENT_TEMP/__npmVersion.tmp"`
      exitWithMessageOnError "getting npm version failed"
    fi

    if [[ ! -n "$NODE_EXE" ]]; then
      NODE_EXE=node
    fi

    NPM_CMD="\"$NODE_EXE\" \"$NPM_JS_PATH\""
  else
    NPM_CMD=npm
    NODE_EXE=node
  fi
}

##################################################################################################################################
# Deployment
# ----------

echo Handling node.js deployment.


# 2. Select node version
# selectNodeVersion
NPM_CMD=npm
NODE_EXE=node

# 3. Install npm packages
if [ -e "$DEPLOYMENT_SOURCE/package.json" ]; then
  cd "$DEPLOYMENT_SOURCE"
  echo "Running $NPM_CMD install --production"
  eval $NPM_CMD install --production
  exitWithMessageOnError "npm failed"
  cd - > /dev/null
fi

# 1. KuduSync
if [[ "$IN_PLACE_DEPLOYMENT" -ne "1" ]]; then
  "$KUDU_SYNC_CMD" -v 50 -f "$DEPLOYMENT_SOURCE/build" -t "$DEPLOYMENT_TARGET" -n "$NEXT_MANIFEST_PATH" -p "$PREVIOUS_MANIFEST_PATH" -i ".git;.hg;.deployment;deploy.sh"
  exitWithMessageOnError "Kudu Sync failed"
fi

##################################################################################################################################
echo "Finished successfully."

【问题讨论】:

  • IIRC 有一种方法可以使用 Azure 为静态网站提供服务,就像 Amazon S3 一样:docs.microsoft.com/en-us/azure/storage/blobs/… 您只需指定 index.html 也用作错误页面(用于客户端路由等等。)。使用这种方法,您无需运行自己的网络服务器,只需将构建工件移动到正确的位置。规模更大的项目可能会在容器内使用 Docker 容器、K8s 和 nginx 来为应用程序提供服务。

标签: reactjs azure azure-web-app-service


【解决方案1】:

稍微少一点的方法是转到门户中的应用服务 - 配置,然后将常规设置选项卡上的启动命令设置为:

npx serve -l 8080 build

这样你不需要添加serve作为依赖,也不需要很长的路径来启动它。

【讨论】:

    【解决方案2】:

    您可以使用 Azure 的静态网页来执行此操作,例如从托管在 GitHub 上的存储库构建代码

    【讨论】:

    • 这个答案需要更多信息才能有用。
    【解决方案3】:

    现在最好的方法是部署到 Azure 静态 Web 应用,它内置了 React 支持。https://docs.microsoft.com/azure/static-web-apps/getting-started?tabs=react

    【讨论】:

    • 这没关系,但如果你有一个服务器与应用程序一起使用,在我的用例中,id 真的宁愿不将两者分开,但由于某种原因,它需要将近 15 秒应用程序来响应并向我发送客户端...
    猜你喜欢
    • 2022-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多