」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 擰它!我開發了自己的靜態網站產生器!

擰它!我開發了自己的靜態網站產生器!

發佈於2024-08-29
瀏覽:694

如今的 Web 开发变得如此复杂,这要归功于数千种新方法的创建者来完成同样的事情。在 Web 开发的早期,他使用了 PHP 和 jQuery,它们几乎可以完成我们需要的一切。但现在情况已经改变了。

长话短说

所以,我正在寻找一种建立我的个人网站的方法。其中会有一些博客和我的项目展示,就是这样,没什么大不了的,对吧?好吧,虽然也是同样的事情。所以,我最初的想法是使用这些作为我的技术堆栈

  • 反应
  • Firebase/Supabase
  • Tailwind CSS
  • 用于部署的 Cloudflare 页面

嗯,这可能是幸福的结局,但是......?

正如我已经说过的,我需要一个博客部分,讽刺的是,博客和 React 并不能很好地结合在一起。因为 React 基本上是用于构建 Web 应用程序而不是内容驱动的网站。现在那些不知道为什么的人这里有一个来自chatGPT的总结

为什么 React 不适合内容驱动的网站

ChatGPT 说,

React 对于内容驱动的网站来说并不理想,主要是因为它依赖于客户端渲染,这可能会对 SEO 和初始页面加载时间产生负面影响。内容驱动的网站受益于服务器端渲染 (SSR) 或静态网站生成 (SSG),而 React 无法直接处理这些内容。 Next.js 或 Gatsby 等扩展了 React 的工具更适合这些需求。

下一个目标:NextJs

很明显,我需要为博客网站提供 SSR,因为我想要搜索引擎良好的索引和专业的社交媒体链接预览。 NextJs 可以给我这两点,但仍然存在一个问题,而且是个人问题。

看,我一直喜欢使用 cloudflare 页面并想坚持下去,此外我希望 cloudflare 的免费电子邮件路由将自定义电子邮件地址附加到我的域,从而降低成本。

Cloudflare 的 NextJS

我尝试通过其官方文档将 nextJS 站点部署到 cloudflare 页面。嗯,事情进展不顺利。我无法在那里部署,我尝试了几个小时寻找解决方案,但没有任何效果。这么说吧,nextJS 和 cloudflare 对我来说并不能很好地结合在一起。因此,如果 Vercel 或 Cloudflare 的任何人阅读本文并纠正我,如果我遗漏了某些内容。

好吧,此时我已经绝望了,我最后的选择是SSG

下一个解决方案:SSG

现在SSG很好,我明白这里的重要性。问题是我以前从未与 SSG 合作过,并且有多种途径可以通过。有雨果、盖茨比、阿斯特罗等等。可能还有更多。现在我对其中任何一个都不熟悉,此时我非常沮丧,以至于我不愿意花一点钱来学习一个简单的博客应用程序的新工具。所以我当时就想,我会做我自己的事情。

创建我自己的静态站点生成器。

我决定开发自己的静态站点生成器的几点原因

  1. 我很沮丧(当然哈哈)
  2. 由于我正在为自己的事情制作自己的工具,因此我将完全控制页面的生成方式。他们会是什么样子。
  3. 我喜欢重新发明。
  4. 我有空闲时间。

计划

该计划采用老式的方式创建网站。单独的文章将有自己的 html 页面。

完整概要如下:

  1. 我将在 palin Markdown 文件上写作
  2. 使用python将markdown解析为纯HTML
  3. 我已经有了一个模板,其中不同的部分将被动态注入。
  4. 此外,我还将有一个与本文相对应的配置文件。所以文件层次结构看起来像这样
articles/
├── art-1
│   ├── art.md
│   └── config.json
├── art-2
│   ├── art.md
│   └── config.json
├── art-3
│   ├── art.md
│   └── config.json
└── art-4
    ├── art.md
    └── config.json

因此,每个帖子都会有自己的文件夹,该文件夹将包含 config.json 和 art.md ,python 脚本将采用 template.html 并将动态内容插入到该 HTML 模板中,例如帖子标题, slug、配置文件中的缩略图和解析后的 Markdown 文件中的主要文章。最重要的是,它会动态生成 SEO 和社交媒体的元标记。之后,它会将更改写入名为 art/.html 的文件,以便帖子链接为 example.com/art/slug。

它是如何整合的?

好吧,我开发了一个 CLI 界面来与生成器交互。我将其命名为 fit,如 F it 所示。它有以下命令或选项:

$ ./fit --help
fit: also known has f**k it build system
A build system for my personal site developed by Shazin

USAGE
     fit  
COMMANDS
    init                Creates a new post template at articles/art-[n]
    build art-       Builds the specified article
    sync                Syncs the global articles index to homepage
    uploader            Launches the GTK GUI image uploader
    upload   Uploads the specified file to firebase
    deploy              Deploys local changes to remote repository
    help, -h, --help    Displays this help menu

部署机制

所以,就像我说的,我想使用 Cloudflare 页面进行部署。基本上我所做的是创建一个名为 prod 的分支,每当运行 ./fit deploy 命令时,它基本上都会将所有必要的文件复制到 prod 分支并将更改推送到 github。然后,cloudflare 将自动构建并重新部署更改。

处理图像

为了处理我使用 firebase 存储的图像或任何静态文件,./fit 上传器将弹出一个基于 GTK 的 GUI 上传器,我可以从中上传图像,它会给我公共 url,我可以比复制,如下所示:

上传接口

Screw it! I

帖子上传接口

Screw it! I

CLI界面

还有一个 CLI 界面,可以通过 ./fit upload )发布或编辑文章

Screw it! I

动态环境背景

所以,我想当我自己处理所有的建筑和生成时,我绝对可以用它做一些很酷的东西,所以我在每篇文章中添加了动态彩色环境背景。我们的想法是从缩略图中选择一种平均颜色,然后将其变暗并将其用作背景。我还从缩略图中为链接和按钮选择了主要颜色,老实说,它看起来真的很酷,这是一个屏幕截图

Screw it! I

评论与讨论

由于我基本上没有使用任何数据库或根本没有后端服务,所以我必须为此选择一个外部服务,还有什么比 Disqus 更好。

值得吗?

嗯,说实话,就像我说的,我花了一些空闲时间,所以是的,这绝对值得,而且说实话,我花了 2-3 天的时间来完成这个完整的项目创造一些有创意的东西真的很有趣。

总结

所以,我在这个项目中获得了非常有趣的体验,并希望能对其进行更多改进并添加更多功能。现在它是如此基本和简单,这就是我想要的。如果您喜欢这个项目或希望我将其开源,请告诉我。哦,这是我对 shazin.me 尖叫的网站的链接,感谢您的阅读。

版本聲明 本文轉載於:https://dev.to/shazin/screw-it-ive-developed-my-own-static-site-generator-27cd?1如有侵犯,請洽[email protected]刪除
最新教學 更多>
  • 在Pandas中如何將年份和季度列合併為一個週期列?
    在Pandas中如何將年份和季度列合併為一個週期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 這個目標是通過組合“年度”和“季度”列來創建一個新列,以獲取以下結果: [python中的concate...
    程式設計 發佈於2025-06-28
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mySQL組使用mySQL組進行查詢結果,在關係數據庫中使用MySQL組,轉移數據的數據是指重新排列的行和列的重排以增強數據可視化。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的轉換為基於列。 Let's consider the following ...
    程式設計 發佈於2025-06-28
  • 如何同步迭代並從PHP中的兩個等級陣列打印值?
    如何同步迭代並從PHP中的兩個等級陣列打印值?
    同步的迭代和打印值來自相同大小的兩個數組使用兩個數組相等大小的selectbox時,一個包含country代碼的數組,另一個包含鄉村代碼,另一個包含其相應名稱的數組,可能會因不當提供了exply for for for the uncore for the forsion for for ytry...
    程式設計 發佈於2025-06-28
  • Java數組中元素位置查找技巧
    Java數組中元素位置查找技巧
    在Java數組中檢索元素的位置 利用Java的反射API將數組轉換為列表中,允許您使用indexof方法。 (primitives)(鏈接到Mishax的解決方案) 用於排序陣列的數組此方法此方法返回元素的索引,如果發現了元素的索引,或一個負值,指示應放置元素的插入點。
    程式設計 發佈於2025-06-28
  • Java中如何使用觀察者模式實現自定義事件?
    Java中如何使用觀察者模式實現自定義事件?
    在Java 中創建自定義事件的自定義事件在許多編程場景中都是無關緊要的,使組件能夠基於特定的觸發器相互通信。本文旨在解決以下內容:問題語句我們如何在Java中實現自定義事件以促進基於特定事件的對象之間的交互,定義了管理訂閱者的類界面。 以下代碼片段演示瞭如何使用觀察者模式創建自定義事件: args...
    程式設計 發佈於2025-06-28
  • 如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解決方案: args)拋出異常{ 日曆cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    程式設計 發佈於2025-06-28
  • 我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    將我的加密庫從mcrypt升級到openssl 問題:是否可以將我的加密庫從McRypt升級到OpenSSL?如果是這樣,如何? 答案:是的,可以將您的Encryption庫從McRypt升級到OpenSSL。 可以使用openssl。 附加說明: [openssl_decrypt()函數要求...
    程式設計 發佈於2025-06-28
  • 同實例無需轉儲複製MySQL數據庫方法
    同實例無需轉儲複製MySQL數據庫方法
    在同一實例上複製一個MySQL數據庫而無需轉儲在同一mySQL實例上複製數據庫,而無需創建InterMediate sqql script。以下方法為傳統的轉儲和IMPORT過程提供了更簡單的替代方法。 直接管道數據 MySQL手動概述了一種允許將mysqldump直接輸出到MySQL cli...
    程式設計 發佈於2025-06-28
  • Java中假喚醒真的會發生嗎?
    Java中假喚醒真的會發生嗎?
    在Java中的浪費喚醒:真實性或神話? 在Java同步中偽裝喚醒的概念已經是討論的主題。儘管存在這種行為的潛力,但問題仍然存在:它們實際上是在實踐中發生的嗎? Linux的喚醒機制根據Wikipedia關於偽造喚醒的文章,linux實現了pthread_cond_wait()功能的Linux實現,...
    程式設計 發佈於2025-06-28
  • Python中嵌套函數與閉包的區別是什麼
    Python中嵌套函數與閉包的區別是什麼
    嵌套函數與python 在python中的嵌套函數不被考慮閉合,因為它們不符合以下要求:不訪問局部範圍scliables to incling scliables在封裝範圍外執行範圍的局部範圍。 make_printer(msg): DEF打印機(): 打印(味精) ...
    程式設計 發佈於2025-06-28
  • C++成員函數指針正確傳遞方法
    C++成員函數指針正確傳遞方法
    如何將成員函數置於c 的函數時,接受成員函數指針的函數時,必須同時提供對象的指針,並提供指針和指針到函數。需要具有一定簽名的功能指針。要通過成員函數,您需要同時提供對象指針(此)和成員函數指針。這可以通過修改Menubutton :: SetButton()(如下所示:[&& && && &&華)...
    程式設計 發佈於2025-06-28
  • 如何使用Depimal.parse()中的指數表示法中的數字?
    如何使用Depimal.parse()中的指數表示法中的數字?
    在嘗試使用Decimal.parse(“ 1.2345e-02”中的指數符號表示法表示的字符串時,您可能會遇到錯誤。這是因為默認解析方法無法識別指數符號。 成功解析這樣的字符串,您需要明確指定它代表浮點數。您可以使用numbersTyles.Float樣式進行此操作,如下所示:[&& && && ...
    程式設計 發佈於2025-06-28
  • 圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    在chrome 在使用Chrome and IE9中的圖像時遇到的一個頻繁的問題是圍繞圖像的持續薄薄邊框,儘管指定了圖像,儘管指定了;和“邊境:無;”在CSS中。要解決此問題,請考慮以下方法: Chrome具有忽略“ border:none; none;”的已知錯誤,風格。要解決此問題,請使用以下...
    程式設計 發佈於2025-06-28
  • Go語言垃圾回收如何處理切片內存?
    Go語言垃圾回收如何處理切片內存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片時,了解垃圾收集行為至關重要,以避免潛在的內存洩...
    程式設計 發佈於2025-06-28
  • 為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    查詢模式實現缺失:解決“無法找到”錯誤在銀光應用程序中,嘗試使用LINQ建立錯誤的數據庫連接的嘗試,無法找到以查詢模式的實現。 ”當省略LINQ名稱空間或查詢類型缺少IEnumerable 實現時,通常會發生此錯誤。 解決問題來驗證該類型的質量是至關重要的。在此特定實例中,tblpersoon可能...
    程式設計 發佈於2025-06-28

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3