JavaScript >> Javascript 文檔 >  >> JavaScript

使用 Discord.js v13 在 JavaScript 中創建 Discord 機器人的指南

簡介

在線交流和與世界各地的人們保持聯繫一直是互聯網誕生之初的主要承諾——一個交流和信息的網絡。相當早的時候,應用程序如雨後春筍般湧現,連接了全球各地的人們,使他們能夠發送消息、多媒體、進行實時視頻和音頻通話,從而以比電話通話更具互動性和吸引力的形式進行國際交流。

2020 年的大流行進一步增加了遠程工作以及與朋友和家人在線交流的需求。那時已經成熟的通信服務迎來了新一波的用戶和應用程序,例如 Zoom、Google Teams、Skype、Discord 和 Webex。

Discord 的不同之處在於,它可以輕鬆地適應特定主題和社區,具有自定義角色、授權和渠道,允許用戶以獨特的方式與給定服務器進行交互——而不僅僅是群聊。

這種可定制性的核心是 Discord 機器人,可以將其設置為對消息、反應或定期執行任務做出反應,從而允許服務器管理員提供結構並創建行為協議。

創建機器人相當容易,並且可以使用多種語言完成 - 例如C#、Java、Go、Lua、NodeJS、PHP、Python 和 Ruby ,在本指南中,我們將了解如何在 JavaScript 中創建 Discord 機器人,以及如何使機器人通過自己的響應對消息做出反應、處理自定義命令以及如何更改機器人的存在。

在深入了解機器人本身之前,如果您不熟悉 Discord 中使用的術語 - 我們將先了解一下基礎知識。

Discord 的基礎知識

最初是基於遊戲玩家的應用程序,如今已成為通用的通信應用程序。如前所述,Discord 是網絡上最流行的通信應用之一。

與大多數此類應用程序一樣,它具有文本、音頻和視頻通信選項,並且完全免費。雖然可以進行一對一的交流,但 Discord 的主要吸引力在於它的服務器 ,可以作為簡單的群聊,但可以擴展為擁有數千人的成熟社區。

  • Discord 服務器

您可以將 Discord 服務器視為由多個房間組成的大房子。這些房間可以分解成文本語音頻道 .如果您想查看一些最受歡迎的服務器,您可以使用列出服務器及其邀請鏈接的服務 在 Top.gg 等網站上。

個人通過邀請鏈接進入服務器 可以是永久的 (只要服務器可用,任何擁有它的人都可以加入),臨時 (任何人都可以在給定的時間範圍內加入)或有限 對某些個人。此外,根據用戶的授權,他們可能會或可能不會創建邀請鏈接——這通常是通過機器人自動完成的。

  • Discord 頻道

如果服務器是一個房子,一個 Discord 頻道就是那個房子的一個房間。渠道用於組織討論主題 - 例如具有營銷渠道的工作場所 , 開發渠道 和一個Memes 頻道 .

文本通道允許用戶發送文本、視頻文件和圖像,您可以通過機器人禁止多媒體並強制僅顯示文本,反之亦然(您可以刪除文本消息並僅強制執行圖像)。

語音通道僅用於語音通信,無論用戶是否存在於其他文本通道中。用戶可以在語音通道中與其他用戶交談,並在單獨的文本通道中輸入消息或在語音通道中流式傳輸視頻。

此外,用戶只有在其授權允許的情況下才能進入頻道。默認情況下,每個人都可以進入每個頻道,但通過基於角色的授權,您可以對具有特定角色的個人隱藏頻道。

  • Discord 機器人

Discord 機器人是為自動執行某些任務或緩和可預測行為而編寫的程序。例如,您可以使用機器人檢測粗口並刪除包含粗口的消息。

無論用戶可以做什麼,機器人都可以做 - 更快,全天候。通常,機器人被授予超級管理員權限,因此它們可以踢、禁止、創建邀請、刪除消息、分配角色等。它們通常用於在用戶版主和管理員不在時協調和維護服務器,以及處理瑣事任務。

存在許多公共機器人,它們是開源的,可以作為通用機器人工作!其中一些甚至具有您可以隨意擺弄的 API,以及可讓您根據自己的喜好自定義它們的 Web 用戶界面,因此普通 Joe 無需任何編碼知識即可創建機器人。

雖然這些方法運行良好,但它類似於使用 WordPress 等服務創建網站 - 您可能希望從頭開始構建它您自己 而是。

話雖如此,讓我們繼續創建一個我們將自動化的 Discord Bot 用戶。

創建 Discord 機器人用戶

機器人最終是用戶,但它們必須是透明的機器人。他們是一個類型 服務器中的用戶和人員知道機器人何時是機器人。要創建機器人並避免濫用和誤用 - 您必須通過 Discord 的開發者門戶註冊它:

discord.com/developers/applications

此頁面用作您編寫的所有應用程序的儀表板:

頁面加載後,您會在右上角看到一個紫色按鈕 - 新應用程序 .

系統將提示您輸入機器人的名稱。在本指南中,我們將其稱為 test-bot 因為它將是一個普通的簡單機器人,但你可以變得更有創意!每次有人加入時,該機器人都會發送一條歡迎消息,這是社區中機器人的典型用途。此外,它還會對某些包含不當語言的消息做出反應,對呼喚它的人做出反應,以及處理來自用戶的命令。

讓我們為機器人輸入一個名稱:

當您單擊創建 ,您將被帶到應用程序的設置。我們將專注於 Bot OAuth2 標籤。 豐富的存在 選項卡用於將 Discord 集成到遊戲中(遊戲開發者可以使用它來交織功能)和 App Testers 標籤用於邀請測試人員測試您的應用。如果您的機器人具有超級管理員權限,並且您對在測試之前發布它持懷疑態度,那麼這是一個有用的功能。

對我們有用的第一個標籤是 Bot 標籤。在這裡,您可以創建一個機器人,更改其頭像、名稱並設置 token .

注意: 一個令牌 實際上是您的機器人的密碼。最好不要將其透露給任何人,因為它可用於以可能損害您的 Discord 服務器的方式操縱機器人。

每個應用程序都需要獲得授權,而 Discord 使用 OAuth2 進行授權——行業標準。在 OAuth2 標籤下 ,我們可以為應用程序選擇範圍,並且由於我們創建了一個機器人,我們將選中 bot 旁邊的框 範圍。檢查後,另一個名為 Bot Permissions 的選項卡 應該會在 Scopes 下方彈出 .

在這裡,我們將設置機器人將擁有的所有權限。由於我們正在製作主要發送短信的機器人,因此這是我們唯一感興趣的部分:

您可能已經註意到,唯一的 General Permission 我們設置的是查看頻道 - 因為機器人需要從一個頻道移動到另一個頻道的權限才能與用戶互動。

當您選擇權限時,OAuth2 URL 生成器將使用唯一的 client_id 添加您的選項 居住。選擇要應用於機器人的所有選項後,複製並點擊鏈接。完成後 - 系統會提示您選擇要添加機器人的服務器。

選擇服務器並確認您不是機器人後,機器人列表中應出現機器人。該機器人將在聊天中離線顯示,直到它被編碼,所以即使你沒有編碼它也不必擔心它的權限。

在 Node.js 中編寫 Discord 機器人

設置好 Bot 用戶後,我們就可以繼續編寫代碼了!

安裝 Discord.js

要編寫機器人代碼,我們將使用 Discord 的 SDK - Discord.js .可通過 NPM 下載:

$ npm install discord.js

安裝後,我們就可以開始了!讓我們為項目創建一個文件夾,並在其中初始化一個空的 Node 項目:

$ mkdir discord_bot
$ cd discord_bot
$ npm init

您可以在實例化項目時保留所有默認選項,或設置一些您自己的選項。

重要提示: 為了使用 Discord.js 模塊,您需要在系統上安裝 Node 16.x+。否則,一個 missing module 'node:events' 將引發錯誤。

了解機器人意圖

機器人意圖 為了正確管理您的機器人,這可能是最重要的概念。機器人意圖是機器人將響應的一組事件。他們有自己的FLAGS 可以設置它以精確定義我們希望機器人對哪些事件做出反應。

初始化機器人時,意圖作為數組傳遞,我們稍後會看到。現在,請記住語法:

Intents.FLAGS.INTENT_NAME

INTENT_NAME 是我們想要添加不同意圖時唯一要更改的部分。要讓機器人對意圖做出反應,請轉到 Bot 開發人員儀表板中的選項卡。在特權網關意圖下 , 開啟 Presence Intent 服務器成員意圖 .

讓我們看看 Discord.js 文檔中定義的一些意圖:

  • GUILDS - 對包含 Create 的任何事件作出反應 或刪除 動作 - 例如 messageCreate .
  • GUILD_MEMBERS - 對事件做出反應,例如向服務器添加、更新和刪除新用戶 .
  • GUILD_MESSAGES - 對事件做出反應,例如發送消息、編輯消息和刪除消息 .
  • GUILD_MESSAGE_REACTIONS - 對 Adding or removing a reaction to a message 等事件作出反應 .

您可能想知道,什麼是公會 突然間?只是服務器的另一個名稱。根據開發者門戶:

有一個不錯的意圖列表,不過,您通常只會將一些意圖用於大多數基本任務。

初始化 Discord 機器人

機器人可以採取的第一個動作就是上網。例如,這是一種被動操作,可以安排在一天中的某些時間在線。現在,讓我們讓機器人在服務器上聯機。

機器人中 儀表板的選項卡,複製您的機器人令牌 - 此令牌在客戶端用於對其進行身份驗證。然後,在 index.js 你的 Node 項目的文件,讓我們導入 Discord.js SDK,定義機器人的意圖並將其設置為在線:

const {
    Client,
    Intents
} = require('discord.js');

const bot = new Client({
    intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD_MESSAGES]
});

bot.on('ready', () => {
    console.log(`Bot ${bot.user.tag} is logged in!`);
});

bot.login('YOUR_BOT_TOKEN'); // Replace the macro with your token

在這裡,我們只是初始化一個Client 對象,它是與 Discord 的 API 交互的主要接口。 Client 機器人。初始化的時候,我們傳入intent數組。

讓我們看看另一段代碼:

bot.on('ready', () => {
  console.log(`Bot ${bot.user.tag} is logged in!`);
});

同樣,Discord 機器人基於 事件驅動架構 . Client 是一個 EventEmitter 我們可以監聽發出的事件並對它們做出反應。

在這種情況下,我們正在監聽 ready 事件和 on() 該事件,我們記錄機器人已登錄。這需要了解 Discord 何時發送事件的先決條件 - 例如,它發送 ready 客戶端登錄時的事件。 user Client 的對象 代表機器人真正的 Discord 用戶。

login() 方法,給定機器人令牌將登錄機器人並發出此事件,並且 on() 然後監聽器觸發,記錄消息。繼續運行腳本,觀察機器人在服務器上線:

$ node index.js
Bot [BOT-NAME] is logged in!

驚人的!已上線並已登錄。讓我們添加另一個事件偵聽器,以便在用戶加入時發送歡迎消息。

向頻道發送歡迎消息

機器人的經典任務是歡迎用戶訪問服務器。這些可以像“歡迎[用戶]!”一樣簡單 更詳細的歡迎,包括隨機消息。您返回的字符串完全取決於您,您的想像力是極限。

當成員被添加到不和諧服務器時,guildMemberAdd 事件被觸發,您可以像收聽其他事件一樣收聽該事件。為了捕捉這個事件,我們之前添加了一個intent 稱為 GUILD_MEMBERS 這讓我們可以聽到它。

首先,讓我們捕獲進入的成員並將其打印到控制台:

bot.on('guildMemberAdd', (member) => {
    console.log(member)
});

再次運行該腳本,當有新用戶進入時,您會看到如下內容:

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

GuildMember {
  guild: <ref *1> Guild {
    id: '<USER_ID>',
    name: undefined,
    icon: undefined,
    features: undefined,
    commands: GuildApplicationCommandManager {
      permissions: [ApplicationCommandPermissionsManager],
      guild: [Circular *1]
    },
    members: GuildMemberManager { guild: [Circular *1] },
    channels: GuildChannelManager { guild: [Circular *1] },
    bans: GuildBanManager { guild: [Circular *1] },
    roles: RoleManager { guild: [Circular *1] },
    presences: PresenceManager {},
    voiceStates: VoiceStateManager { guild: [Circular *1] },
    stageInstances: StageInstanceManager { guild: [Circular *1] },
    invites: GuildInviteManager { guild: [Circular *1] },
    deleted: false,
    available: false,
    shardId: 0,
    memberCount: NaN
  },
  joinedTimestamp: 1633939430866,
  premiumSinceTimestamp: null,
  deleted: false,
  nickname: null,
  pending: false,
  _roles: [],
  user: User {
    id: '<USER_ID>',
    bot: false,
    system: false,
    flags: UserFlags { bitfield: 0 },
    username: '<MEMBER_USERNAME>',
    discriminator: '<MEMBER_DISCRIMINATOR>',
    avatar: null,
    banner: undefined,
    accentColor: undefined
  },
  avatar: null
}

GuildMember 上有一堆信息 (服務器內的 Discord 用戶)不過,對我們來說有趣的是:

  • guild - 服務器信息,帶有 id 等屬性 , name , members , channels , presences 等。
  • _roles - 包含服務器中用戶角色的數組(如果存在)。
  • user - 用戶信息,具有id等屬性 , bot , username , discriminator 等。
  • discriminator 是一個整數,它是完整用戶名的一部分,通常看起來像:randomUser#1234 ,所以 1234 是一個鑑別器。

關於 User 之間的區別有很多困惑 和一個 GuildMember ,它實際上只是歸結為:

現在,讓我們調整代碼使其不打印 GuildMember 例如,而是向他們打招呼。通常,有一個專門的問候和歡迎文字頻道 - 而您 想用 #general 頻道。

此外,通常還有一個 #bot-spam 用於可能會使實際聊天頻道混亂的卑鄙機器人輸出的頻道。當然,您可以不發送某些消息,但將它們記錄在服務器或外部文件中以供以後使用會有所幫助。
如果您不希望此頻道向普通用戶隱藏,您可以隱藏它公開。

您可以通過單擊服務器名稱旁邊的下拉菜單並單擊創建頻道來創建新頻道 .提示將詢問您是否需要 Text語音 渠道。我們將選擇一個文本,並將其命名為 #welcome .

我們可以通過獲取其實例和 send() 向通道發送消息 方法。實例是通過通道的 ID 獲得的,這在你的機器人的生命週期中被稱為常量。

要獲取頻道的 ID,我們必須打開 開發者模式 打開,並使用應用程序的 UI。通過單擊應用程序左下方的小齒輪,轉到您的 Discord 設置。在應用設置 在窗口的左側,您會發現 Advanced 標籤。在那裡,打開開發者模式 .這將允許我們檢索通道 ID。這是通過右鍵單擊頻道名稱並單擊複製 ID 來完成的 .

讓我們使用該 ID 來 fetch() 一個頻道並向其發送消息,on() 用戶加入事件:

bot.on('guildMemberAdd', (member) => {
    const channelId = 'CHANNEL_ID'; // The Channel ID you just copied
    const welcomeMessage = `Hey <@${member.id}>! Welcome to my server!`;
    member.guild.channels.fetch(channelId).then(channel => {
        channel.send(welcomeMessage)
    });
});

正如我們之前看到的,一個 guild 有關於其頻道的信息,我們可以使用 member.guild.channels 檢索這些信息 .最後,為了得到我們想要的頻道,我們調用方法fetch() 並將頻道 ID 作為參數傳遞。此方法返回 Promise , 所以必須跟一個 then() ,我們定義了一個函數,在我們檢索到所需的通道後要執行。在這種情況下,這將是一個簡單的 .send() 包含消息的文本。

同樣,您可以在這裡做更多的事情,例如從模板列表中選擇一條隨機消息,記錄頻道外的信息等。

<@${member.id}> message 只是在消息中標記用戶,因此他們在加入服務器時會收到此消息的通知。您可以省略 @ 但是,在開始時跳過標記部分,服務器通常會標記人們以引起他們的注意並重定向他們以閱讀服務器的規則。

當用戶加入您的服務器時,他們會收到您的消息:

驚人的!讓我們繼續給我們的機器人更多的自主權,允許它拾取某些短語或單詞並對其做出反應。

檢測頻道中的消息並做出反應

一旦人們加入您的服務器,他們就會發送消息。發送的每條消息都會創建一個 messageCreate 事件,不出所料,您可以收聽。您不想在每條消息中向用戶發送垃圾郵件 ,但在某些情況下,您的機器人可能想要對某事做出反應。

例如,如果有人呼叫機器人或用戶包含不敏感的詞,您可能希望機器人響應或採取行動。例如,讓我們添加兩個監聽器 - 一個讓機器人對用戶調用它做出反應,另一個對人們在消息中發送不恰當的詞作出反應。

要檢測消息,您需要 GUILDSGUILD_MESSAGES 意圖。

捕獲消息時,message 對象包含 content 消息,channel 消息來自哪裡,等等。然後,只需檢查該字符串是否包含其他字符串:

bot.on('messageCreate', (message) => {
    if(message.content.toLowerCase().includes('hey bot') || message.content.toLowerCase().includes('general kenobi')){
        message.channel.send('Hello there!');
    }
});

bot.on('messageCreate', (message) => {
    if(message.content.toLowerCase().includes('fudge') || message.content.toLowerCase().includes('pudding')){
        message.channel.send('Such language is prohibited!');
    }
});

機器人只會響應 if 中定義的消息 從 message 對象本身。當然,您也可以將消息發送到其他頻道,或者將其定向到僅為管理員保留的隱藏頻道。

再次運行腳本並輸入一些消息後,機器人就會回复!

注意: 機器人會對自己的消息做出反應,因為它們也會觸發 messageCreate 發送時的事件。

如果您對用戶的回复包含可能與其他 if 匹配的字詞 聲明,你的機器人最終可能會無限地回復自己:

bot.on('messageCreate', (message) => {
    if(message.content.toLowerCase().includes('fudge') && message.content.toLowerCase().includes('pudding')) {
			message.channel.send('Why of course, I love fudgy pudding cake!');
	} else if(message.content.toLowerCase().includes('fug') || message.content.toLowerCase().includes('pudding')){
        message.channel.send('Such language is prohibited!');
	}
});

軟糖布丁蛋糕很好吃,所以如果有人告訴我們軟糖布丁,他們一定是指製作蛋糕的過程,所以我們回復了一個很好的消息 - 但是,響應中的“布丁”匹配響應創建的新事件處理程序。因此,機器人會響應 that 帶有自己的消息:

哎呀。您可以像這樣輕鬆創建無限循環。例如:

bot.on('messageCreate', (message) => {
    if(message.content.toLowerCase().includes('a')) {
			message.channel.send('a');
	}
});

這段代碼將響應 "a" 每當消息包含 "a" - 這導致機器人說 "a" 的 5 條消息爆發的無限流 :

檢查和回复消息時要小心,注意includes()等方法有多強大 或 contains() 可。幸運的是,避免這個問題非常簡單。

阻止機器人回復自己

您不希望機器人回復自己,或在示例中自相矛盾,例如帶有軟糖布丁蛋糕的示例。值得慶幸的是,您可以輕鬆檢查誰發送了消息,如果它是由機器人發送的則忽略它,完全避免了無限循環問題:

if(message.author.bot) {
    return;
}

讓我們在前面的示例中添加此檢查:

bot.on('messageCreate', (message) => {
	if (message.author.bot) {
		return;
	} else if(message.content.toLowerCase().includes('fudge') && message.content.toLowerCase().includes('pudding')) {
			message.channel.send('Why of course, I love fudgy pudding cake!');
	} else if(message.content.toLowerCase().includes('fug') || message.content.toLowerCase().includes('pudding')){
        message.channel.send('Such language is prohibited!');
	}
});

第一個if 語句檢查是否有 bot 是否發送消息。如果是這樣,則以下規則並不真正適用,因此我們永遠不會進入無限狀態。讓我們向機器人發送另一個關於他們的蛋糕的發自內心的信息:

效果很好!

創建機器人命令

由於我們已經了解瞭如何處理髮送到服務器的消息,現在讓我們為其定義一些命令,以允許用戶通過受控環境對其進行命令。首先,讓我們用不同的信息歡迎我們的用戶。我們現在必須讓他們如何找到命令列表,以及如何使用它們:

bot.on('guildMemberAdd', (member) => {
    const channelId = 'CHANNEL_ID';
    const welcomeMessage = `Hey <@${member.id}>! Welcome to my server! \n See commands list by typing: $listCommands`;
    member.guild.channels.fetch(channelId).then(channel => {
        channel.send(welcomeMessage)
    });
});

實際上,命令只是遵循您為自己設置的某種形式的消息,我們可以像目前檢查消息一樣檢查命令。

您不必使用 $ 符號來表示命令。有些使用點(. )、斜線 (/ ) 等。一般來說,一些 符號用於表示命令而不是消息。

讓我們編寫命令,包括 $listCommands 一。我們可以在現有的 messageCreate 之一中執行此操作 偵聽器或新的偵聽器 - 我們將只處理不同的 message.content .為了樣式化命令列表的響應,我們將使用 MessageEmbed 它看起來類似於quoteblock。它允許我們設置顏色、標題、描述以及字段以及它們的鍵(名稱)和值來描述命令。

使用 MessageEmbed 實例,我們需要先從 Discord.js 導入它,所以讓我們更新最初導入的類:

const {
    Client,
    Intents,
	MessageEmbed
} = require('discord.js');

現在,我們可以創建一個新的 if 處理命令的語句:

bot.on('messageCreate', (message) => {
    if(message.content.toLowerCase().includes('hey bot') || message.content.toLowerCase().includes('general kenobi')){
        message.channel.send('Hello there!');
    }
	
	if (message.content == '$listCommands') {
        const exampleEmbed = new MessageEmbed()
            .setColor('#ffd046')
            .setTitle('Server Commands')
            .setDescription('Here you can see the list of the commands used on the server: ')
            .addFields(
                { name: "`$like`", value: 'Likes the current message' },
                { name: "`$dislike`", value: 'Dislikes the current message'},
                { name: "`$random`", value: 'Returns a random number'},
            )
        message.channel.send({embeds: [exampleEmbed]})
    }

    if (message.content == '$like') {
        message.react('👍');
    }

    if (message.content == '$dislike') {
        message.react('👎');
    }

    if(message.content == '$random'){
        message.react('✅');
        let randomNumber = getRandomNumber(0, 1000);
        message.reply(`Your random number is ${randomNumber}.`)
    }
});

我們還有一個輔助方法來生成一定範圍內的隨機數:

function getRandomNumber(min, max){
    return Math.floor(Math.random() * (max-min) + min);
}

if-else 子句可能不是處理命令的最佳選擇,但如果有幾個就可以了。但是,如果您希望您的服務器具有廣泛的命令,您可能應該考慮將它們放在一個文件中,並讓機器人在發送消息時找到正確的命令並對其做出反應。

再次運行腳本允許我們使用這些命令:

更改機器人的狀態

機器人登錄後,您可以更改其存在。這可能表示機器人處於待機狀態,等待命令或任務,或者只是為您設置服務的基調。例如,您可以將其設置為在線時“玩遊戲”或“為社區服務”。

這是一個可選的小任務,但在幽默和表示機器人何時以及是否可用和在線方面可以大有幫助:

bot.login('YOUR_BOT_TOKEN').then(() => {
    bot.user.setPresence({ activities: [{ name: 'a random game', type: 'PLAYING' }], status: 'online' });
});

存在由活動和狀態定義。活動是用戶正在執行的一系列活動。他們有一個 name 和一個 type . type 是一個宏,可以設置為PLAYING , WATCHING , LISTENING , STREAMINGCOMPETING .它們類似於存在的句子的開頭,所以 name 是它的延續。

上面代碼的存在應該是這樣的:

結論

Discord 機器人具有可塑性,在編寫它們時,您的想像力是極限。不可否認,它們是 Discord 作為社區建設平台和出色的信使和通信應用程序爆發的主要原因之一。

Discord 擁有一個非常大的社區和 Discord 服務器的良好傳統,其中有很多非常有用的服務器。如果您有自己的想法,現在是時候開始開發服務器了!


Tutorial JavaScript 教程
  1. N|Solid 中的工作線程監控 [6/10] Node 的最佳 APM,逐層。

  2. 面向初學者的 Angular 模塊指南

  3. 觀看:使用 Webpack 轉換 JSX

  4. 從頭開始創建 Netflix 克隆:JavaScript PHP + MySQL 第 42 天

  5. 使用 Auth0 進行 Next.js 身份驗證的終極指南

  6. 從 GraphQL 生成 Javascript 靜態類型:TypeScript 和 Flow

  7. 嘗試遞歸地散列對像中的值

  1. 在 15 分鐘內為 Joplin 構建一個 Telegram 機器人🤖

  2. 將 Vue 3s 組合 API 與 D3 一起使用

  3. NoSQL 數據庫之戰什麼時候用什麼

  4. 使用 VS Code Devcontainers 為 Ruby on Rails 和 React 設置 linter。

  5. 如何在 Angular 14 應用程序中集成谷歌地圖

  6. ES-Next 動態導入

  7. 如何在網絡上上傳一些特殊的文件擴展名(djvu、jp2、...)

  1. TypeScript 簡介 - 基礎知識

  2. Vue.js + Vuex 表單綁定電路

  3. 5 用於移動設備的 jQuery 滾動條

  4. Flowplayer 動態視頻大小