強制下載HTML中的連結

最近我發現可以在a標籤中加入download屬性: <a href="file.pdf" download>pdf</a> 這樣瀏覽器就會強制下載連結,即使該檔案可以在瀏覽器中打開(例如PDF檔)。 這個方法只適用於同源的連結。

從 macOS 選單列執行 Node.js 腳本

我想要快速添加從選單列執行 Node.js 腳本的方法。 有許多選擇,包括製作自己的 macOS 選單列應用程式或使用第三方應用程式。 但是 macOS 也提供了一種簡單的方式,使用古老的 AppleScript。 在 macOS 上打開 Script Editor 應用程式。 開啟它的設定並啟用 在選單列顯示 Script 選單 : 現在點擊檔案 → 新增選單以開啟腳本編輯器: 為了執行我的 Node.js 腳本,我添加了這行: do shell script "cd /Users/myself/dev; /opt/homebrew/bin/node script.js" 作為一名 JavaScript 開發者,我必須提醒您也可以使用JavaScript for Automation (JXA) 來達到相同的效果: const app = Application.currentApplication() app.includeStandardAdditions = true app.doShellScript('cd /Users/myself/dev; /opt/homebrew/bin/node script.js') 但在這種情況下,我更喜歡使用 AppleScript,這更符合「原生」的感覺。 我使用了 cd 以便 Node 可以讀取我放在該資料夾的 .env 檔案。 然後我點擊腳本名稱,添加一個好的名字並保存到我用戶的腳本資料夾中,該資料夾位於 ~/Library/Scripts。 完成所有這些步驟後,我就可以在選單列上找到我的腳本,像這樣: 就是這樣! 現在我可以執行它,當腳本執行完成時,一個旋轉的齒輪會出現,通知我: 非常酷!

從 Node.js 腳本中調用 ImageOptim macOS 應用程式

平常在我的 Node.js 腳本中,我通常使用 sharp 來優化圖片。 但有時候我喜歡使用 ImageOptim macOS 應用程式 來通過圖形界面優化圖片。 這次我需要從一個 Node.js 腳本中啟動它。 下面是我的做法。 首先我導入了內建的 child_process Node 模組: import * as child from 'node:child_process' 然後我這樣調用它來優化特定文件夾中的所有圖片: const images_folder = './img' child.exec(`open -a ImageOptim ${images_folder}`) 這樣就會啟動該應用程式,你可以看到它的用戶界面,這沒什麼大不了的。 需要注意的是,這僅在你安裝了該應用程式的情況下才能正常工作。

從 Node.js 腳本優化圖片

我一直在使用一個工具來優化圖片,它叫做 sharp。 import sharp from 'sharp' 下面是我如何使用它將圖片轉換為 webp 的示例: await sharp('image.png') .webp({ lossless: true }) .toFile('image.webp') 它還可以進行更多的圖像處理操作,例如旋轉、調整大小等。

從JS日期獲取年-月-日

我遇到了這個需求。 基本上,我想要以這個形式獲取今天的日期: 2023-01-20T07:00:00+02:00 要求是T07:00:00+02:00保持不變(我不想讓時間改變)。 但我希望今天的日期是當前日期。 JS中的Date物件的toISOString()方法可以給你日期數據: '2023-01-10T07:35:37.826Z' 但我只想要年、月、日。 我本來打算使用getFullYear()等方法從日期中抽取數據,但我想到可以直接將toISOString()返回的字符串截斷,於是我使用了以下代碼: `${new Date().toISOString().slice(0, 10)}T07:00:00+02:00`

從瓦特計算Ah

在我的房車上,我有一個12V 100Ah的電池。 假設我有一個100瓦的吹風機,我會透過一個功率變換器使用它。在電池電量耗盡之前,我可以使用它多少個小時? 使用的公式是 Wh / V,在這種情況下是: 100Wh/12V = 8,333Ah 1瓦特-小時是指1瓦特的功率耗損1小時 由於這個電池是100Ah,所以我可以使用它達到12小時 (100Ah / 8,333Ah)。 如果我有一個消耗200瓦特的設備,我可以使用它 6 小時。 這假設電池是充滿電且我可以使用它的100%電力,這在LiFePo4電池幾乎是可能的,但對於普通的鉛酸電池則不然。

從哪裡下手購買 Arduino 和電子設備

在我的電子教程系列中,我使用了一套我多年來購買的工具。 我確實可以給你一些建議,讓你開始進行我所做的實驗。 Arduino 是一個很棒的項目,我強烈推薦你購買原裝的 Arduino 零件,以支持該項目和整個生態系統。 但是,當你剛開始時,你需要很多小零件,如果單獨購買可能會很貴。你可以找到一些一次性配備許多東西的套件。 特別推薦一個由 Elegoo 生產的套件,你可以在亞馬遜上以53.99美元/45歐元(撰寫時)的價格找到。它被稱為 ELEGOO UNO R3 Project Most Complete Starter Kit w/Tutorial Compatible with Arduino IDE (63 Items)。 這是一個包含了一塊 Arduino Uno rev 3複製板和許多組件、傳感器和小零件的盒子,這些東西通常很有用: 它附帶了很多東西:一個麵包板、很多電線、電阻、LED、電池、擴展板、電源模塊、水位傳感器、數字鍵盤、液晶屏、按鈕、搖杆、步進馬達和伺服馬達、紅外接收器和發射器、繼電器、超聲波傳感器等等。 另一個非常完整且更便宜的套件(但似乎零件和傳感器較少)是 ELEGOO UNO Project Super Starter Kit with Tutorial and UNO R3 Compatible with Arduino IDE。 我給我的一位朋友送了其中一個,很酷。 還有其他類似的套件,但請確保板子是 Arduino Uno,這是更好的起點。 然後我建議你購買一個多用表。任何多用表都可以,你可以在當地工具店或互聯網上的任何地方買到。 就先這樣。你需要先試試便宜的套件,然後如果你喜歡嘗試電子設備,就沒有極限了。 你可以購買一個具有 WiFi 和藍牙通信功能的設備,例如 Arduino MKR Wifi 1010 和 Arduino MKR GPS shield 來使用 GPS 等功能。

從教學到自己的專案的過程

什麼時候應該從閱讀/觀看教學轉移到實際開始進行專案呢? 有人在Twitter上問我:如何從教學轉移到專案呢? 我覺得這個問題很有趣,因為我相信要真正學會一個技術,你需要用它來建立一些東西。 你不能只是閱讀教學,但是當然,一些教學仍然是必需的。 沒有人天生就會使用某個東西,除非我們被教導如何使用,或者我們深入研究了相關文件,或者在一個特殊情況下,我們瞭解該事物應該如何工作,這是我們在使用開源軟件時可以實際做到的事情(但這比較容易說得比做得好)。 每週我都會定期學習新東西,這是我的工作的一部分。這也是我喜歡做的事情。 學習新知識是我的生計。然後我使用這些知識來創建項目和軟件,或者將這項技術教授給其他人。 但是從學習一些東西到實際構建項目是具有挑戰性的。 在“閱讀/觀看X教學”和“構建下一個Airbnb”之間,沒有明確可見的界線。 教學使你達到比你起點更進階的程度。 但在某個時候,你需要開始一個項目,以跨越到下一個水平: 在“結束教學階段”和“開始項目階段”之間存在著一段神秘的間隔。 通過“項目”,我的意思也是指一個樣本網絡應用程式,用於測試你的想法,不一定是一個大型或最終的項目。 如果不進行項目,你就無法達到那個更高的水平。 著名的格言“讓你成功的東西不會讓你更進一步成功”說得很對。 你會達到遞減回報的點,如果你不停止僅僅閱讀教學,你會開始遺忘那些將要應用的知識,而你將不得不回到閱讀教學的階段: 不管怎樣,你仍然會不斷回到教學中。但是對於在項目開發過程中遇到的特定需求,你需要回顧教學。 你只需要有一個項目的想法。如果你還沒有想法,就去想一想。或者看看我的樣本應用點子清單。 從按照IKEA傢俱的逐步指示開始,到從頭開始建造自己的傢俱難嗎?當然很難。 但如果你從不開始,就永遠不會達到那個點。 給自己一些時間,然後開始做吧。

從教學製作者的角度談教學煉獄

如何停止閱讀教學並開始做事 在學習過程中,總有個時刻你會意識到: 你已經掌握了開始實現你想法所需的知識。 要建立應用程式並不需要成為JavaScript巫師。你只需要掌握基礎知識,並有動力解決困難。 擁有個人關心的專案是克服不可避免的障礙的最好動力。 我是個聽Podcast的重度聽眾,尤其喜歡一些人描述從零開始到產品上線的旅程的集數。很多時候,這些人從零知識開始,在需要時建立技能。不會預先學習太多東西,只會在必要時才做。 解決所有的問題 你要如何解決將遇到的問題呢?當然是使用Google。Google是你最好的朋友。我已經從事專業開發了10年,一直使用Google和Stack Overflow來回答我的問題。 但是Google只是一個工具,一個會將網頁與關鍵字匹配的笨機器。Stack Overflow只是個沒有人回答問題就毫無價值的網路應用程式。 在這些網站的背後,有數以百萬計的開發者花時間寫部落格文章或回答Stack Overflow上的問題。 艱鉅的事實 我是那些在網上分享資訊的人之一,我在這個部落格每天寫一篇教學。自從開始以來,我已經寫了300多篇教學。讓我告訴你一個事實:你永遠不會停止閱讀教學,因為技術不斷變化。 今天大家使用的某些技術,10年後會被視為過時。這已經發生過,也將再次發生。想一想jQuery、Angular 1.0或XHTML。 此外,你的需求也在不斷變化: 你今天學到的東西,將成為你明天建立更酷東西的基礎。 但是不要讓學習阻礙你作為創作者的進步。你可以學習的最重要的技能,不是如何讓程式碼實現某件事,而是如何用程式碼創造出東西。 建立一個令你自豪的東西,從今天開始。

從無代碼到部分代碼

我試著做些我從未嘗試過的事情:依靠一個服務處理網站。 我一直想要對我所做的一切擁有絕對的控制權。 但後來我愛上了Notion,並且喜歡它為網站提供動力的想法,正如我在這篇文章中所解釋的那樣。 在那裡,我提到了將我的新課程的登陸頁面託管的可能性。 但我改變了主意,因為我需要以無法使用Notion或其周圍的任何工具實現的方式來自定義它。 特別是我需要嵌入一個連接到付款彈出窗口的按鈕,並且這不是一個簡單的事情。 所以這是我所做的:我在Notion中構建了登陸頁面,因為我真的很喜歡它易於起草的方式。 然後我將其導出為HTML。 HTML輸出相當乾淨,僅含有最少的CSS。 然後我添加了一些部分響應的代碼,自定義了HTML以處理付款處理,然後對一些內容進行了更改。 我將使用Cloudflare Pages發布這個頁面。 所以,我不再是完全無代碼,而是使用無代碼創建了一個草稿,然後通過代碼對其進行了增強。 我喜歡這個想法。 下一門課,JavaScript課程,仍然是在Notion中構建的,因為我計劃利用其靈活性,使在制作課程的同時更加輕鬆。 但是我決定只將該部分保留在Notion中(以及我所有的私人內容)。對於這樣的使用情境,它確實非常出色。 課程結束後,我可能會將課程從Notion導出並放入靜態站點中。 這樣我就可以享受到使用拖放方式更新並即時更新的站點的好處(請記住,該課程是以同班同學為基礎的,所以每天都會解鎖新課程),最終完成後可以處於某種“存檔模式”。我仍然不確定是否可行,但如果可以的話,那將是很酷的。 我在全面無代碼方面仍然有一些問題。 我會喪失控制權。 而我想要控制權。 控制權,和自由一起,是我最重視的事情之一。