【问题标题】:Deploying React app with Parcel build on Github Pages在 Github Pages 上使用 Parcel 部署 React 应用程序
【发布时间】:2022-01-12 11:20:50
【问题描述】:

我正在尝试在 Github 页面上部署一个带有 Parcel 的 React 应用程序。

我已经部署了它,但应用程序实际上并没有在屏幕上呈现。我不明白我做错了什么。

包.json

{
  "name": "pet-adoption-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "homepage": "https://github.com/junaidshaikh-js/pet-adoption-app",
  "scripts": {
    "format": "prettier --write \"src/**/*.{js,jsx}\"",
    "lint": "eslint \"src/**/*.{js,jsx}\" --quiet",
    "dev": "parcel src/index.html --public-url /pet-adoption-app/",
    "predeploy": "npm build",
    "deploy": "gh-pages -d dist"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/junaidshaikh-js/pet-adoption-app.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/junaidshaikh-js/pet-adoption-app/issues"
  },
  "devDependencies": {
    "@babel/core": "^7.12.16",
    "@babel/eslint-parser": "^7.13.4",
    "@babel/plugin-proposal-class-properties": "^7.13.0",
    "@babel/plugin-transform-runtime": "^7.16.4",
    "@babel/preset-env": "^7.13.5",
    "@babel/preset-react": "^7.12.13",
    "eslint": "^8.3.0",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-import": "^2.22.1",
    "eslint-plugin-jsx-a11y": "^6.4.1",
    "eslint-plugin-react": "^7.22.0",
    "eslint-plugin-react-hooks": "^4.2.0",
    "gh-pages": "^3.2.3",
    "parcel": "^1.12.3",
    "prettier": "^2.4.1"
  },
  "dependencies": {
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-router-dom": "^5.2.0"
  }
}

这是实时部署的链接:https://junaidshaikh-js.github.io/pet-adoption-app/

这里是 Github 仓库:https://github.com/junaidshaikh-js/pet-adoption-app

【问题讨论】:

  • 脚本和样式未发布。看起来服务器上只有 index.html 。 Parcel 必须构建所有内容,因为文件名已损坏,但文件根本不存在。
  • 我该如何解决?
  • gh-pages 命令将你的 dist 发布到你的 repo 的 gh-pages 分支。您是否将此分支设置为此 repo 中 GitHub Pages 的“源”?转到设置>页面进行验证。
  • 是的,这是源分支
  • 问题在于,在 index.html(已发布的)中,您的 CSS 和 JS 文件与这样的路径链接:/style.e308ff8e.js,也就是说它们是预期的位于根文件夹中。但是你的应用的 URL 是 junaidshaikh-js.github.io/pet-adoption-app,所以 index.html ,所有的 CSS 和 JS 文件都位于 /pet-adoption-app 文件夹。您需要配置 Parcel,以便它将该相对路径添加到所有链接。

标签: reactjs deployment github-pages parceljs


【解决方案1】:

第 1 步

  1. git remote add origin [YOUR REPO LINK]
  2. git add -A
  3. git commit -m "Initial commit"
  4. git push -u origin main

第 2 步

"homepage": "https://[USERNAME].github.io/[YOUR REPO NAME]",

第 3 步

npm install gh-pages --save-dev

第 4 步

在你的 package.json 文件中添加一个脚本

"predeploy": "npm run build",
"deploy": "gh-pages -d build",

运行下面给出的命令

npm run deploy

【讨论】:

  • 我已经部署了该应用,但它无法正常工作
【解决方案2】:

正如@tromgy 在讨论中指出的那样,问题的根源在于生成的html 页面在对各种资产的url 引用之前包含/ 字符。

例如,如果您在domain.com/subfolder/index.html 有一个包含<script src="/script.js"> 的html 文件,浏览器将在domain.com/script.js 而不是domain.com/subfolder/script.js 查找脚本。

如果您改为删除 /(例如 <script src="script.js">),浏览器将查找相对于 html 文件所在位置的脚本(例如 domain.com/subfolder/script.js),这可能就是您想要的。

Parcel 支持--public-url 选项来完成此操作(请参阅cli docstarget docs)。通过将. 作为参数传递,您可以告诉parcel 从输出中省略/。所以你的构建脚本会是这样的:

parcel build src/index.html --public-url .

(奇怪的是,在您的问题中,您显示了一个使用此选项的 dev 命令,但我在示例 repo 中没有看到该代码)

另外需要注意的是,您使用的是不受支持的 v1 版本的 parcel。我将您升级到 v2 并在 this PR 中修复了上述问题。

【讨论】:

  • 嘿 Andrew,我做了一些更改,应用程序正在部署,但没有完全运行。你能再检查一次吗?感谢您的宝贵时间。
  • 您在部署的站点中遇到了同样的问题 - URL 前面的/。在克隆的 repo 上运行 npm run build 会产生正确的 html 输出(即没有斜杠)。我注意到的一件事是部署的 HTML 和 Javascript 是 unminified (即它一定是由于运行 parcel 导致的(即开发模式,在您的存储库中没有任何 --public-url 标志) , 而不是npm run build) 也许问题是predeploy 脚本是npm build(这是作为npm install 的一部分运行的内部命令)而不是npm run build,这是您的parcel build 脚本?
【解决方案3】:

经过数小时的研究,我发现当您使用react-router-dom > v4 并部署到子域(例如您的情况下为//pet-adoption-appk)时,您必须提供basename 属性带有子域值的<BrowserRouter>。在您的情况下,您必须像这样传递它<BrowserRouter basename="/pet-adoption-app">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 2019-12-28
    • 1970-01-01
    • 2021-10-08
    • 2019-09-19
    相关资源
    最近更新 更多