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

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

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

如今的 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]刪除
最新教學 更多>
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-05-10
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-05-10
  • 如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    程式設計 發佈於2025-05-10
  • 解決Spring Security 4.1及以上版本CORS問題指南
    解決Spring Security 4.1及以上版本CORS問題指南
    彈簧安全性cors filter:故障排除常見問題 在將Spring Security集成到現有項目中時,您可能會遇到與CORS相關的錯誤,如果像“訪問Control-allo-allow-Origin”之類的標頭,則無法設置在響應中。為了解決此問題,您可以實現自定義過濾器,例如代碼段中的MyFi...
    程式設計 發佈於2025-05-10
  • 反射動態實現Go接口用於RPC方法探索
    反射動態實現Go接口用於RPC方法探索
    在GO 使用反射來實現定義RPC式方法的界面。例如,考慮一個接口,例如:鍵入myService接口{ 登錄(用戶名,密碼字符串)(sessionId int,錯誤錯誤) helloworld(sessionid int)(hi String,錯誤錯誤) } 替代方案而不是依靠反射...
    程式設計 發佈於2025-05-10
  • PHP SimpleXML解析帶命名空間冒號的XML方法
    PHP SimpleXML解析帶命名空間冒號的XML方法
    在php 很少,請使用該限制很大,很少有很高。例如:這種技術可確保可以通過遍歷XML樹和使用兒童()方法()方法的XML樹和切換名稱空間來訪問名稱空間內的元素。
    程式設計 發佈於2025-05-10
  • 在Pandas中如何將年份和季度列合併為一個週期列?
    在Pandas中如何將年份和季度列合併為一個週期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 這個目標是通過組合“年度”和“季度”列來創建一個新列,以獲取以下結果: [python中的concate...
    程式設計 發佈於2025-05-10
  • Java開發者如何保護數據庫憑證免受反編譯?
    Java開發者如何保護數據庫憑證免受反編譯?
    在java 在單獨的配置文件保護數據庫憑證的最有效方法中存儲憑據是將它們存儲在單獨的配置文件中。該文件可以在運行時加載,從而使登錄數據從編譯的二進製文件中遠離。 使用prevereness class import java.util.prefs.preferences; 公共類示例{ 首選...
    程式設計 發佈於2025-05-10
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-05-10
  • 為什麼不使用CSS`content'屬性顯示圖像?
    為什麼不使用CSS`content'屬性顯示圖像?
    在Firefox extemers屬性為某些圖像很大,&& && && &&華倍華倍[華氏華倍華氏度]很少見,卻是某些瀏覽屬性很少,尤其是特定於Firefox的某些瀏覽器未能在使用內容屬性引用時未能顯示圖像的情況。這可以在提供的CSS類中看到:。 googlepic { 內容:url(&...
    程式設計 發佈於2025-05-10
  • Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    在ASP.NET async void void async void void void void void的設計無需返回asynchroncon而無需返回任務對象。他們在執行過程中增加未償還操作的計數,並在完成後減少。在某些情況下,這種行為可能是有益的,例如未期望或明確預期操作結果的火災和...
    程式設計 發佈於2025-05-10
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在時間戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源於遺留實現的關注,這些限制需要對當前的_timestamp功能進行特定的實現。 創建表`foo`( `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-05-10
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    程式設計 發佈於2025-05-10
  • 在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在JTable中維護jtable單元格渲染後,在JTable中,在JTable中實現自定義單元格渲染和編輯功能可以增強用戶體驗。但是,至關重要的是要確保即使在編輯操作後也保留所需的格式。 在設置用於格式化“價格”列的“價格”列,用戶遇到的數字格式丟失的“價格”列的“價格”之後,問題在設置自定義單元...
    程式設計 發佈於2025-05-10
  • Go語言如何動態發現導出包類型?
    Go語言如何動態發現導出包類型?
    與反射軟件包中的有限類型的發現能力相反,本文探索了替代方法,探索了在Runruntime。 go import( “ FMT” “去/進口商” ) func main(){ pkg,err:= incorter.default()。導入(“ time”) 如果er...
    程式設計 發佈於2025-05-10

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

Copyright© 2022 湘ICP备2022001581号-3