배포 및 온라인

i18n.site 단일 페이지 애플리케이션 아키텍처를 채택하고 웹사이트 입구 페이지와 웹사이트 콘텐츠가 독립적으로 배포됩니다.

위의 변환을 실행하면 md/out/dev 디렉터리 아래에 디렉터리 htmv 가 생성됩니다.

여기서 dev .i18n/htm/dev.yml 구성 파일을 기반으로 구축되었음을 의미합니다.

dev 디렉토리 :

htm 디렉토리는 웹사이트 입구 페이지입니다.

v 디렉토리에는 버전 번호가 있는 웹 사이트 콘텐츠가 포함되어 있습니다.

로컬 미리보기는 버전 번호에 관심이 없으며 모든 파일을 out/dev/v/0.1.0 디렉터리에 복사합니다.

공식 릴리스의 경우 변경된 파일이 새 버전 번호 디렉터리에 복사됩니다.

구성 파일을 -c 으로 지정

다른 구성 파일은 out 디렉터리에 해당 디렉터리를 생성합니다.

예를 들어 .i18n/htm/main.yml out/main 디렉터리를 생성합니다.

dev.ymlmain.yml 이 기본 구성입니다.

devdevelopment 의 약자로 개발 환경을 나타내며 로컬 미리보기에 사용되며 기본 구성 파일이기도 합니다. olonline 의 약자로 공식 릴리스에 사용되는 온라인 환경을 의미하며 명령줄 매개변수 -n ~ npm 을 사용하여 릴리스할 때 기본 구성 파일이기도 합니다.

다른 구성 파일을 생성할 수도 있습니다. 명령줄에서 --htm_conf 사용하여 사용할 구성 파일 이름을 지정합니다.

예를 들어:

i18n.site --htm_conf dist --save

여기서 --save 업데이트 릴리스 버전 번호를 나타냅니다.

npmjs.com에 콘텐츠 게시

npmjs.com 에 콘텐츠를 게시하는 것이 권장되는 기본 솔루션입니다( 프런트엔드 고가용성 참조).

npm 로그인 & 게시물

nodejs 설치하고 npm login 로 로그인하세요.

md/.i18n/htm/main.yml 편집하고 md: 의 값을 YOUR_NPM_PACKAGE 변경합니다. npm 의 비어 있는 패키지 이름이 npmjs.com .

그런 다음 md/.i18n/htm/main.package.json 수정하십시오.

번역하고 출판하려면 md 디렉터리에서 i18n.site --npm 또는 i18n.site -n 실행하세요.

지속적 통합 환경을 사용하여 게시한다면 nodejs 설치할 필요가 없습니다. 로그인한 권한과 게시 권한 ~/.npmrc 환경에 복사하면 됩니다.

v: in main.yml 패키지명을 수정하는 경우 반드시 .i18n/v/main 먼저 삭제한 후 게시하시기 바랍니다.

npm이 게시한 프록시 서버

중국 본토의 사용자가 네트워크 문제를 겪고 npm 를 게시할 수 없는 경우 환경 변수 https_proxy 설정하여 프록시 서버를 구성할 수 있습니다.

프록시 서버 포트가 7890 이라고 가정하면 다음과 같이 작성할 수 있습니다.

https_proxy=http://127.0.0.1:7890 i18n.site -n

자체 호스팅 콘텐츠

콘텐츠를 자체 호스팅하려면 먼저 md/.i18n/htm/main.yml 편집하고 v: //unpkg.com/i18n.site URL 접두사(예: v: //i18n-v.xxx.com 로 변경하세요.

md 디렉토리에 들어가서 실행하세요.

i18n.site --htm_conf ol --save

또는 약어

i18n.site -c ol -s

그런 다음 md/out/main/v 디렉터리의 콘텐츠를 v: 에 설정된 URL 접두사 경로로 구성합니다.

마지막으로 /.v 으로 끝나는 경로의 캐시 시간을 1s 로 구성합니다 . 그렇지 않으면 새로 출시된 콘텐츠에 즉시 접근할 수 없습니다.

다른 경로의 캐시 시간을 1년 이상으로 설정하여 불필요한 요청을 줄일 수 있습니다.

s3에 콘텐츠 호스팅

콘텐츠를 자체 호스팅하려면 자체 서버를 CDN 하는 것 외에 또 다른 일반적인 옵션은 S3 +

rclone 사용하여 S3 서버에 로그인한 후 다음 스크립트를 참조 및 수정하고 각 릴리스에 대한 증분 변경 사항만 S3 에 복사할 수 있습니다.

i18n.site -c ol -s
s3=your-s3
bucket=your-bucket
ver=$(head -1 .i18n/v/main/v.hash | cut -c 2-)
rclone copy --overwrite-dir out/main/htm/v/$ver $s3:/$bucket/$ver
rclone copy out/main/v/.v "$s3:/$bucket/"

/.v 로 끝나는 경로의 캐시 시간이 1s 가 되도록 CDN 구성해야 합니다. 그렇지 않으면 새로 출시된 콘텐츠에 즉시 액세스할 수 없습니다.

웹사이트 게시

웹사이트는 어디든 배포할 수 있습니다. github pagecloudflare page 은 좋은 선택입니다.

웹사이트는 단일 페이지 애플리케이션 아키텍처를 사용하므로 . ~ index.html 포함하지 않는 URL 경로를 다시 작성해야 합니다.

웹사이트 시작 페이지는 한 번만 배포하면 되며, 이후 콘텐츠 업데이트를 위해 웹사이트 시작 페이지를 다시 배포할 필요가 없습니다.

Github 페이지에 배포

먼저 여기 github 클릭하여 조직을 만드세요 . 예를 들어 다음 조직 이름은 i18n-demo 입니다.

그런 다음 이 조직 아래에 창고 i18n-demo.github.io 만듭니다( i18n-demo 생성한 조직 이름으로 바꾸십시오).

이전 글의 내용을 게시할 때 out/main/htm 생성되었습니다. 이 디렉터리에 들어가서 : 실행하세요.

ln -s index.html 404.html

github page URL 경로 재작성을 지원하지 않으므로 대신 404.html 이 사용됩니다.

그런 다음 htm 디렉토리에서 다음 명령을 실행하십시오( i18n-demo/i18n-demo.github.io.git 자신의 창고 주소로 바꾸는 것을 기억하십시오) :

git init
git branch -M main
git remote add origin [email protected]:i18n-demo/i18n-demo.github.io.git
git push -u origin main -f

코드를 푸시한 후 액세스하기 전에 github page 배포가 성공적으로 실행될 때까지 기다립니다(아래 참조).

데모 페이지는 다음을 참조하세요.

https://i18n-demo.github.io

Cloudflare 페이지에 배포

cloudflare page github page 에 비해 경로 재작성을 제공하고 중국 본토에 더 친숙하며 사용을 권장합니다.

cloudflare page 의 배포는 일반적으로 위의 github page 의 배포를 기반으로 합니다.

프로젝트를 생성하고 위의 i18n-demo.github.io 번 창고를 바인딩합니다.

프로세스는 아래 그림에 나와 있습니다.

조직 i18n-demo 에 대한 액세스 권한을 부여하려면 Add Account 클릭하세요.

다른 조직의 창고를 바인딩한 경우 새 조직이 표시되기 전에 Add Account 두 번 클릭하여 두 번 인증해야 할 수도 있습니다.

다음으로 창고 i18n-demo.github.io 을 선택한 후 Begin setup 클릭하고 이후 단계에서는 기본값을 사용합니다.

처음으로 바인딩한 후 액세스하려면 몇 분 정도 기다려야 합니다.

배포 후 사용자 지정 도메인 이름을 바인딩할 수 있습니다.

사용자 정의 도메인 이름을 바인딩한 후 아래와 같이 도메인 이름으로 이동하여 단일 페이지 애플리케이션의 경로 재작성을 구성하십시오.

위 그림의 규칙은 다음과 같습니다. 아래 첫 번째 줄의 i18n.site 바인딩한 도메인 이름으로 바꾸세요.

(http.host in {"i18n.site"}) and not (
substring(http.request.uri.path,-3) in {".js" ".gz"} or
substring(http.request.uri.path,-4) in {".htm" ".rss" ".css" ".svg" ".ico" ".png" ".xml" ".txt"} or
substring(http.request.uri.path,-5) in {".html" ".avif" ".json"} or
ends_with(http.request.uri.path,".webmanifest")
)

또한 아래와 같이 캐시 규칙을 구성하고 캐시 기간을 1개월로 설정해 주세요.

위 그림의 두 번째 단계에서 일치하는 도메인 이름을 바인딩한 도메인 이름으로 변경하세요.

중국 본토의 웹사이트 배포 최적화

중국 본토의 네트워크 환경에서 더 나은 접근성 성능을 얻으려면 먼저 도메인 이름을 등록 하십시오.

그런 다음 중국 본토의 클라우드 공급업체의 개체 스토리지를 사용하십시오 + CDN 다음 콘텐츠를 배포하십시오 out/main/htm

엣지 컴퓨팅을 사용하여 단일 페이지 애플리케이션에 맞게 경로를 다시 작성할 수 있습니다. 예를 들어 Baidu Smart Cloud CDN 다음과 같이 구성할 수 있습니다.

const uri = r.uri, p = uri.lastIndexOf(".");
if (
  p < 0 ||
  !"|js|css|htm|html|md|avif|json|ico|xml|rss|gz|mp4|png|svg|txt|webmanifest|".includes(
    "|" + uri.slice(p + 1) + "|",
  )
) {
  const ua = r.headersIn["User-Agent"].toLowerCase()
  if (/facebookexternalhit|slurp|bot|spider|curl/.test(ua)) {
    r.return(
      302,
      (/baidu|yisou|sogou|360|byte/.test(ua) ? "/zh" : "/en") + r.uri + ".htm",
    )
  } else {
    r.uri = "/index.html"
  }
}

r.respHeader(() => {
  const t = [], out = r.headersOut;
  ["Content-MD5", "Age", "Expires", "Last-Modified"].forEach(
    i => delete out[i]
  )
  r.rawHeadersOut.forEach(i => {
    const key = i[0].toLowerCase()
    if (key.startsWith("x-") || key.startsWith("ohc-")) {
      delete out[key]
    }
  })
  out["Cache-Control"] = "max-age=" + 9e5
  // out.XXX = 'MSG';와 같이 출력을 디버그하도록 응답 헤더를 설정할 수 있습니다.
})

레코드 MX 과 레코드 CNAME 공존할 수 없기 때문에 동시에 도메인 이름 이메일을 받으려면 레벨 CNAME 에서 레코드 A 으로 cname_flatten 스크립트와 협력해야 합니다.

또한, 중국 본토에 있는 클라우드 공급업체의 해외 트래픽 요금은 상대적으로 비싸기 때문에 비용을 최적화하고 싶다면 Huawei DNS 의 무료 지리적 해상도Cloudflare for SaaS 의 사용자 정의 도메인 이름(아래 참조)을 사용하여 달성할 수 있습니다. 트래픽 전환──중국 본토 트래픽 라우팅 Baidu Cloud CDN , 국제 트래픽은 cloudflare 입니다.

이러한 배포 최적화 솔루션은 더욱 복잡하며 향후 별도의 장에서 소개될 예정입니다.

일반 도메인 이름 리디렉션

i18n.site 사용하여 웹사이트를 기본 웹사이트로 생성하는 경우 일반적으로 팬 도메인 리디렉션을 구성해야 합니다. 즉, 액세스를 *.xxx.com ( www.xxx.com 포함)에서 xxx.com 으로 리디렉션합니다.

이 요구 사항은 Alibaba Cloud CDN EdgeScript ( 영어 문서 / 중국어 문서 )을 통해 달성할 수 있습니다.

Alibaba CDN 에 도메인 이름을 추가하고 Alibaba Cloud CDN 에서 도메인 이름을 *.xxx.com ~ CNAME 로 지정하세요.

예를 들어 위 그림에서 팬 도메인 이름 리디렉션 구성이 *.i18n.site 인 경우는 다음과 같습니다.

rewrite(concat('https://i18n.site',$uri), 'redirect',301)

nginx로 배포

!의 server 단락에 다음과 유사한 구성을 추가하십시오 nginx /root/i18n/md/out/main/htm 자신의 프로젝트 out/main/htm 의 경로로 변경하십시오.

location / {
  root  /root/i18n/md/out/main/htm;
  add_header Cache-Control "max-age=9999999";
  if ($uri !~* \.(avif|css|html|ico|js|json|png|svg|txt|webmanifest|xml)$) {
     rewrite ^ /index.html last;
  }
}

github action 지속적인 통합을 기반으로

다음을 참조하여 github action 을 구성할 수 있습니다.

name: i18n.site

on:
  workflow_dispatch:
  push:
    branches:
      - main
      - dist

jobs:
  i18n:

    permissions:
      repository-projects: write
      contents: write

    runs-on: ubuntu-latest

    steps:
      - name: checkout
        uses: actions/checkout@v4

      - name: https://i18n.site
        uses: i18n-site/github-action-i18n.site@main
        with:
          I18N_SITE_TOKEN: ${{ secrets.I18N_SITE_TOKEN }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

구성에서 볼 수 있듯이 이 워크플로는 분기 main 과 분기 dist 로 푸시할 때 트리거됩니다.

워크플로는 분기 이름에 해당하는 구성 파일을 사용하여 문서를 게시합니다. 여기서는 게시 구성으로 각각 .i18n/htm/main.yml.i18n/htm/dist.yml 사용됩니다.

문서 릴리스 프로세스에 대해 다음 모범 사례를 권장합니다.

변경 사항이 분기 main 에 푸시되면 문서가 트리거되어 미리 보기 스테이션에 구축 및 배포됩니다(미리 보기 스테이션을 사용할 수 있습니다 github page ).

미리보기 사이트에서 문서가 올바른지 확인한 후 코드가 병합되어 브랜치 dist 으로 푸시되고 공식 빌드 및 배포가 온라인으로 전환됩니다.

물론 위 프로세스를 구현하려면 더 많은 구성을 작성해야 합니다.

워크플로우 스크립팅을 위해 실제 프로젝트를 참조할 수 있습니다 github.com/fcdoc/doc

구성의 secrets.I18N_SITE_TOKENsecrets.NPM_TOKEN 사용하려면 코드 베이스에서 비밀 변수를 구성해야 합니다.

I18N_SITE_TOKEN 접근 가능 i18n.site/token

NPM_TOKEN 구성에서 패키지 npm 의 게시 토큰입니다. npmjs.com 방문하여 게시 권한이 있는 토큰을 만듭니다(아래 참조).

디렉토리 구조

public

favicon.ico , robots.txt 등과 같은 웹사이트의 정적 파일입니다.

여기의 아이콘 파일은 realfavicongenerator.net

.i18n

.i18n 디렉터리 아래에는 i18n.site 의 구성 파일, 번역 캐시 등이 있습니다. 자세한 내용은 다음 장 "구성" 을 참조하세요.

en

.i18n/conf.yml 구성 파일의 fromTo 에 해당 en 소스 언어 디렉터리

i18n:
  fromTo:
    en: zh

번역 구성을 참고해주세요 i18