Puter 在生产环境中

构建

  1. npm run build

使用

将在 dist 目录中构建 Puter。在您的 HTML 页面中包含生成的 ./dist/gui.js 文件,并在页面加载时调用 gui()

  1. <script type="text/javascript" src="./dist/gui.js"></script>
  2. <script type="text/javascript">
  3. window.addEventListener('load', function() {
  4. // 初始化 GUI。所有选项都是可选的!
  5. gui({
  6. // 应用程序的来源。这是 GUI 的基础 URL。
  7. gui_origin: "https://puter.com",
  8. // API 的来源。这是 GUI 调用其所有操作的 API 端点的基础 URL。
  9. api_origin: "https://api.puter.com",
  10. // 用户网站托管的域名。
  11. hosting_domain: "puter.site",
  12. // 文件/目录名称的最大长度。
  13. max_item_name_length: 500,
  14. // GUI 是否需要在允许用户发布网站之前强制执行电子邮件验证。
  15. require_email_verification_to_publish_website: true,
  16. })
  17. });
  18. </script>

生产环境完整示例

假设生产环境中有以下目录结构:

  1. .
  2. ├── dist/
  3. ├── favicons/
  4. ├── images/
  5. ├── bundle.min.css
  6. ├── bundle.min.js
  7. ├── gui.js
  8. └── ...
  9. └── index.html

下面的 index.html 文件将加载 Puter 以及所有必要的元标签、favicons 和品牌资产:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>Puter</title>
  5. <meta name="author" content="Puter Technologies Inc.">
  6. <meta name="description" content="Puter 是一个注重隐私的个人云,可以将您所有的文件、应用程序和游戏保存在一个私密且安全的地方,随时随地从任何地方访问。">
  7. <meta name="facebook-domain-verification" content="e29w3hjbnnnypf4kzk2cewcdaxym1y" />
  8. <link rel="canonical" href="https://puter.com">
  9. <!-- Meta meta tags -->
  10. <meta property="og:url" content="https://puter.com">
  11. <meta property="og:type" content="website">
  12. <meta property="og:title" content="Puter">
  13. <meta property="og:description" content="Puter 是一个注重隐私的个人云,可以将您所有的文件、应用程序和游戏保存在一个私密且安全的地方,随时随地从任何地方访问。">
  14. <meta property="og:image" content="./dist/images/screenshot.png">
  15. <!-- Twitter meta tags -->
  16. <meta name="twitter:card" content="summary_large_image">
  17. <meta property="twitter:domain" content="puter.com">
  18. <meta property="twitter:url" content="https://puter.com">
  19. <meta name="twitter:title" content="Puter">
  20. <meta name="twitter:description" content="Puter 是一个注重隐私的个人云,可以将您所有的文件、应用程序和游戏保存在一个私密且安全的地方,随时随地从任何地方访问。">
  21. <meta name="twitter:image" content="./dist/images/screenshot.png">
  22. <!-- favicons -->
  23. <link rel="apple-touch-icon" sizes="57x57" href="./dist/favicons/apple-icon-57x57.png">
  24. <link rel="apple-touch-icon" sizes="60x60" href="./dist/favicons/apple-icon-60x60.png">
  25. <!-- 其他 favicons ... -->
  26. <link rel="manifest" href="./dist/manifest.json">
  27. <meta name="msapplication-TileColor" content="#ffffff">
  28. <meta name="msapplication-TileImage" content="./dist/favicons/ms-icon-144x144.png">
  29. <meta name="theme-color" content="#ffffff">
  30. <!-- 当适用时预加载图片 -->
  31. <link rel="preload" as="image" href="./dist/images/wallpaper.webp">
  32. </head>
  33. <body>
  34. <!-- 加载 GUI 脚本 -->
  35. <script type="text/javascript" src="./dist/gui.js"></script>
  36. <!-- 在文档加载时初始化 GUI -->
  37. <script type="text/javascript">
  38. window.addEventListener('load', function() {
  39. gui()
  40. });
  41. </script>
  42. </body>
  43. </html>

服务器设置

GUI 是一个单页应用程序 (SPA),最佳实践是任何根路径下的路由 (/*) 应优先加载 index.html 文件。然而,在某些情况下,我们可能希望为特定路由加载自定义页面:例如,/privacy 路由可能需要加载一个包含您的隐私政策的页面,而与 GUI 应用程序无关。在这些情况下,只要以下基本 GUI 路由用 GUI 加载(即 index.html 文件)就可以加载自定义页面:

  • /app/*
  • /action/*

换句话说,将上述路由视为 Puter 的“保留”路由。

最佳实践

  • title 标签和元标签 (<title></title>, <meta property="og:title", <meta name="twitter:title", …) 应由服务器动态设置。例如,如果 URL 是应用程序的(例如 https://puter.com/app/editor)那么 title 标签和元标签应包含应用程序的标题而不是通用的 Puter 标题。

  • description 元标签 (<meta name="description", <meta property="og:description", <meta name="twitter:description", …) 应由服务器动态设置。例如,如果 URL 是应用程序的(例如 https://puter.com/app/editor)那么 description 元标签应包含应用程序的描述而不是通用的 Puter 描述。

  • 确保动态添加到 HTML 页面的任何 HTML 代码都被转义。例如,如果应用程序的描述是 Puter is a <b>privacy-first</b> personal cloud to keep all your files, apps, and games in one private and secure place, accessible from anywhere at any time.<b> 标签应转义为 &lt;b&gt;,以便浏览器不会将其解释为 HTML 标签。

  • 确保在动态向 HTML 页面添加文本时将所有换行符替换为空格。

  • 通常,出于 UX 和 SEO 的原因,请确保标签用有关 URL 所代表状态的相关信息填充。例如,用户是在桌面上还是在一个应用程序中?