ไปที่คอนโซล

部署配置

firebase.json 文件

firebase init 命令会在项目的根目录中创建一个 firebase.json 设置文件。此文件为必需文件,用于配置部署时将发布哪些文件。firebase.json 中的 Firebase 托管配置格式如下:

{
  "hosting": {
    "public": "app",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}

默认属性

下面将详细介绍默认属性 publicignore

public

"public": "app"

必需 - public 设置会指示 firebase 命令将哪个目录上传至 Firebase 托管。该目录必须位于项目目录内,且必须已存在。默认值是名为“public”的目录。

ignore

"ignore": [
  "firebase.json",
  "**/.*",
  "**/node_modules/**"
]

可选 - ignore 设置是一个可选参数,用于指定在部署时要忽略的文件。它可以处理 glob 定义,所采用的方式与 git 处理 .gitignore 的方式一样。

高级属性

firebase.json 文件有其他几个用于托管配置的可选参数。您可以在此处查看完整的托管配置 firebase.json 文件。下面将详细介绍这些可选的参数:

redirects

"redirects": [ {
  "source" : "/foo",
  "destination" : "/bar",
  "type" : 301
}, {
  "source" : "/firebase/*",
  "destination" : "https://www.firebase.com",
  "type" : 302
} ]

可选 - redirects 设置是一个可选参数,包含一组重定向规则。每条规则必须指定 sourcedestinationtype

source 参数是一个 glob 模式,它会在每个请求开始时(在确定该网址路径中是否存在文件或文件夹之前)与所有网址路径进行匹配。如果发现匹配,即会设置一个 HTTP 重定向响应,其中的“Location”标头设为静态 destination 字符串 - 可能是相对路径,也可能是绝对网址。

最后,type 参数指定提供的具体 HTTP 响应代码 - 可能是 301(对应于“已永久移动”)或 302(对应于“已找到”(临时重定向))。

捕捉重定向

有时候用户会需要捕捉重定向中源网址的一些部分,并在目标网址中重用这些部分。您可以使用 : 前缀指出要捕捉的部分,还可选择性地在名称后加上 * 表示其还应捕捉网址的其余部分:

"redirects": [ {
  "source": "/blog/:post*",
  "destination": "https://blog.myapp.com/:post*",
  "type": 301
},
{
  "source": "/users/:id/profile",
  "destination": "/users/:id/newProfile",
  "type": 301
} ]

rewrites

"rewrites": [ {
  "source": "**",
  "destination": "/index.html"
} ]

可选 - rewrites 设置是一个可选参数,包含一组网址重写规则。与上述重定向类似,每条重写规则必须具有一个 source glob 模式和一个本地 destination(应该以文件的形式存在)。重写规则仅在指定源中不存在文件或文件夹的情况下适用,而且返回的是目标位置的实际内容而非 HTTP 重定向的内容。

如果不存在匹配的已上传文件,以上示例会将任何网址重写为 /index.html 的内容,这对于使用 HTML5pushState 的应用来说非常方便。

headers

"headers": [ {
  "source" : "**/*.@(eot|otf|ttf|ttc|woff|font.css)",
  "headers" : [ {
    "key" : "Access-Control-Allow-Origin",
    "value" : "*"
  } ]
}, {
  "source" : "**/*.@(jpg|jpeg|gif|png)",
  "headers" : [ {
    "key" : "Cache-Control",
    "value" : "max-age=7200"
  } ]
}, {
  // Sets the cache header for 404 pages to cache for 5 minutes
  "source" : "404.html",
  "headers" : [ {
    "key" : "Cache-Control",
    "value" : "max-age=300"
  } ]
} ]

可选 - headers 设置是一个可选参数,包含一组自定义标头定义。每个定义必须有一个与原始请求路径匹配的 source 键,无论使用 glob 表示法的重写规则为何。每个定义还必须具备一系列要应用的 headers,其中每个 header 都要有一个 key 和一个 value

上述示例为所有字体文件指定了 CORS 标头,并将图片文件默认的 1 小时浏览器缓存重写为 2 小时缓存。

以下标头不可使用 headers 配置进行设置:

  • Strict-Transport-Security
  • Public-Key-Pinning
  • Set-Cookie

cleanUrls

"cleanUrls": true

可选 - cleanUrls 设置是一个可选参数,当设置为 true 时,将从已上传文件的网址中自动删除 .html 扩展名。如果网址带有 .html 扩展名,则系统会执行 301 重定向,以便重定向至不含 .html 扩展名的同一路径。

trailingSlash

"trailingSlash": false

可选 - trailingSlash 设置是一个可选参数,可用于控制网址的结尾是否带有斜杠。如果设置为 true,它将重定向网址以便在结尾处添加斜杠。如果设置为 false,它将重定向网址以移除结尾处的斜杠。若不指定,则将仅为目录索引文件使用结尾斜杠(例如 about/index.html)。

Glob 模式匹配

上面详细介绍的 firebase.json 定义通过 extglob 广泛使用 glob 模式匹配表示法,其方式与 Git 处理 gitignore 规则以及 Bower 处理 ignore 规则的方式类似。 此 Wiki 页提供了更加详细的参考。以上示例的解释如下:

  • firebase.json 仅匹配公共目录的根目录下的 firebase.json 文件。
  • ** 会匹配任意子目录中的任何文件或文件夹。请注意,* 仅匹配根目录下的文件和文件夹。
  • **/.* 匹配任意子目录中以“.”开头的任何文件(通常是隐藏文件,例如 .git 文件夹)。
  • **/node_modules/** 匹配“node_modules”文件夹(该文件夹本身可以是公共目录的任意子目录)的任意子目录中的任何文件或文件夹。
  • **/*.@(jpg|jpeg|gif|png) 匹配任意子目录中以“.”结尾并且是“jpg”、“jpeg”、“gif”或“png”格式之一的任何文件。

完整的托管配置示例

{
  "hosting": {
    "public": "app",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "redirects": [ {
      "source" : "/foo",
      "destination" : "/bar",
      "type" : 301
    }, {
      "source" : "/firebase/*",
      "destination" : "https://www.firebase.com",
      "type" : 302
    } ],
    "rewrites": [ {
      "source": "/app/**",
      "destination": "/app/index.html"
    } ],
    "headers": [ {
      "source" : "**/*.@(eot|otf|ttf|ttc|woff|font.css)",
      "headers" : [ {
        "key" : "Access-Control-Allow-Origin",
        "value" : "*"
      } ]
      }, {
      "source" : "**/*.@(jpg|jpeg|gif|png)",
      "headers" : [ {
        "key" : "Cache-Control",
        "value" : "max-age=7200"
      } ]
      }, {
      "source" : "404.html",
      "headers" : [ {
        "key" : "Cache-Control",
        "value" : "max-age=300"
      } ]
    } ],
    "cleanUrls": true,
    "trailingSlash": false
  }
}