国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) web前端 js教程 如何使用 OpenAI、Vercel AI SDK 和 Ollama 以及 Next.js 建立 AI 助手

如何使用 OpenAI、Vercel AI SDK 和 Ollama 以及 Next.js 建立 AI 助手

Nov 07, 2024 am 03:30 AM

在今天的部落格文章中,我們將使用三種不同的 AI 模型來建構(gòu) AI 助理:OpenAI 的 Whisper 和 TTS 以及 Meta 的 Llama 3.1。

在探索人工智慧時(shí),我想嘗試不同的事情並創(chuàng)建一個(gè)透過語(yǔ)音工作的人工智慧助理。這種好奇心促使我將 OpenAI 的 Whisper 和 TTS 模型與 Meta 的 Llama 3.1 結(jié)合起來,建構(gòu)了一個(gè)語(yǔ)音活化助理。

以下是這些模型如何協(xié)同工作:

  • 首先,我們將音訊傳送到 Whisper 模型,該模型會(huì)將其從語(yǔ)音轉(zhuǎn)換為文字。
  • 接下來,我們將該文字傳遞給 Llama 3.1 模型。 Llama 將理解文字並產(chǎn)生回應(yīng)。
  • 最後,我們將 Llama 的回覆傳送到 TTS 模型,將文字重新轉(zhuǎn)換為語(yǔ)音。然後我們會(huì)將音訊串流回客戶端。

讓我們深入研究並開始建立這個(gè)優(yōu)秀的人工智慧助理!

開始使用

我們將使用不同的工具來建立我們的助手。為了建立我們的客戶端,我們將使用 Next.js。不過,您可以選擇您喜歡的框架。

要使用我們的 OpenAI 模型,我們將使用他們的 TypeScript / JavaScript SDK。要使用此 API,我們需要以下環(huán)境變數(shù):OPENAI_API_KEY—

要取得此金鑰,我們需要登入 OpenAI 儀表板並找到 API 金鑰部分。在這裡,我們可以產(chǎn)生一個(gè)新的密鑰。

Open AI dashboard inside the API keys section

太棒了。現(xiàn)在,要使用我們的 Llama 3.1 模型,我們將使用 Ollama 和 Vercel AI SDK,並利用名為 ollama-ai-provider 的提供者。

Ollama 將允許我們下載我們喜歡的模型(我們甚至可以使用不同的模型,例如 Phi)並在本地運(yùn)行它。 Vercel SDK 將促進(jìn)其在我們的 Next.js 專案中的使用。

要使用Ollama,我們只需下載它並選擇我們喜歡的型號(hào)。對(duì)於本博文,我們將選擇 Llama 3.1。安裝 Ollama 後,我們可以透過開啟終端機(jī)並編寫以下命令來驗(yàn)證它是否正常運(yùn)作:

Terminal, with the command ‘ollama run llama3.1’

請(qǐng)注意,我寫了“l(fā)lama3.1”,因?yàn)檫@是我選擇的模型,但您應(yīng)該使用您下載的模型。

開始事情

是時(shí)候開始設(shè)定我們的 Next.js 應(yīng)用程式了。讓我們從這個(gè)指令開始:

npx create-next-app@latest

運(yùn)行命令後,您將看到一些設(shè)定應(yīng)用程式詳細(xì)資訊的提示。讓我們一步一步來:

  • 為您的應(yīng)用程式命名。
  • 啟用應(yīng)用程式路由器

其他步驟是可選的,完全取決於您。就我而言,我還選擇使用 TypeScript 和 Tailwind CSS。

現(xiàn)在已經(jīng)完成了,讓我們進(jìn)入我們的專案並安裝運(yùn)行模型所需的依賴項(xiàng):

npx create-next-app@latest

建立我們的客戶端邏輯

現(xiàn)在,我們的目標(biāo)是錄製我們的聲音,將其發(fā)送到後端,然後接收來自後端的語(yǔ)音回應(yīng)。

為了錄製音頻,我們需要使用客戶端功能,這意味著我們需要使用客戶端元件。在我們的例子中,我們不想將整個(gè)頁(yè)面轉(zhuǎn)換為使用客戶端功能並將整個(gè)樹放在客戶端包中;相反,我們更願(yuàn)意使用伺服器元件並匯入客戶端元件來逐步增強(qiáng)我們的應(yīng)用程式。

所以,讓我們建立一個(gè)單獨(dú)的元件來處理客戶端邏輯。

在我們的應(yīng)用程式資料夾中,讓我們建立一個(gè)元件資料夾,在這裡,我們將建立我們的元件:

npm i ai ollama-ai-provider openai

讓我們繼續(xù)初始化我們的元件。我繼續(xù)添加了一個(gè)帶有一些樣式的按鈕:

app
 ?components
  ?audio-recorder.tsx

然後將其匯入到我們的Page Server元件中:

// app/components/audio-recorder.tsx
'use client'
export default function AudioRecorder() {
    function handleClick(){
      console.log('click')
    }

    return (
        <section>
        <button onClick={handleClick}
                    className={`bg-blue-500 text-white px-4 py-2 rounded shadow-md hover:bg-blue-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:ring-offset-white transition duration-300 ease-in-out absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2`}>
                Record voice
            </button>
        </section>
    )
}

現(xiàn)在,如果我們運(yùn)行我們的應(yīng)用程序,我們應(yīng)該看到以下內(nèi)容:

First look of the app, showing a centered blue button

太棒了!現(xiàn)在,我們的按鈕不執(zhí)行任何操作,但我們的目標(biāo)是錄製音訊並將其發(fā)送到某個(gè)地方;為此,讓我們創(chuàng)建一個(gè)包含我們邏輯的鉤子:

// app/page.tsx
import AudioRecorder from '@/app/components/audio-recorder';

export default function Home() {
  return (
      <AudioRecorder />
  );
}

我們將使用兩個(gè) API 來錄製我們的聲音:navigator 和 MediaRecorder。導(dǎo)航器 API 將為我們提供有關(guān)用戶媒體設(shè)備的信息,例如用戶媒體音頻,而 MediaRecorder 將幫助我們錄製其中的音頻。這就是他們一起玩的方式:

app
 ?hooks
  ?useRecordVoice.ts

import { useEffect, useRef, useState } from 'react';

export function useRecordVoice() {
  return {}
}

讓我們逐步解釋這段程式碼。首先,我們建立兩個(gè)新狀態(tài)。第一個(gè)用於追蹤我們何時(shí)錄製,第二個(gè)用於儲(chǔ)存 MediaRecorder 的實(shí)例。

// apps/hooks/useRecordVoice.ts
import { useEffect, useRef, useState } from 'react';

export function useRecordVoice() {
    const [isRecording, setIsRecording] = useState(false);
    const [mediaRecorder, setMediaRecorder] = useState<MediaRecorder | null>(null);

     const startRecording = async () => {
        if(!navigator?.mediaDevices){
            console.error('Media devices not supported');
            return;
        }

        const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
        const mediaRecorder = new MediaRecorder(stream);
        setIsRecording(true)
        setMediaRecorder(mediaRecorder);
        mediaRecorder.start(0)
    }

    const stopRecording = () =>{
        if(mediaRecorder) {
            setIsRecording(false)
            mediaRecorder.stop();
        }
    }

  return {
    isRecording,
    startRecording,
    stopRecording,
  }
}

然後,我們將建立第一個(gè)方法,startRecording。在這裡,我們將擁有開始錄製音訊的邏輯。
我們首先檢查使用者是否有可用的媒體設(shè)備,這要?dú)w功於導(dǎo)航器 API,它為我們提供了有關(guān)使用者瀏覽器環(huán)境的資訊:

如果我們沒有媒體設(shè)備來錄製音頻,我們就返回。如果他們這樣做,那麼讓我們使用他們的音訊媒體設(shè)備來創(chuàng)建一個(gè)串流。

 const [isRecording, setIsRecording] = useState(false);
    const [mediaRecorder, setMediaRecorder] = useState<MediaRecorder | null>(null);

最後,我們繼續(xù)建立 MediaRecorder 的實(shí)例來錄製此音訊:

npx create-next-app@latest

然後我們需要一個(gè)方法來停止我們的錄音,這就是我們的 stopRecording。在這裡,如果存在媒體錄製器,我們將停止錄製。

npm i ai ollama-ai-provider openai

我們正在錄製音頻,但我們不會(huì)將其儲(chǔ)存在任何地方。讓我們新增一個(gè)新的 useEffect 和 ref 來完成此任務(wù)。
我們需要一個(gè)新的引用,這就是我們的音訊資料塊的儲(chǔ)存位置。

app
 ?components
  ?audio-recorder.tsx

在 useEffect 中,我們將做兩件主要的事情:將這些區(qū)塊儲(chǔ)存在我們的 ref 中,當(dāng)它停止時(shí),我們將創(chuàng)建一個(gè)音訊/mp3 類型的新 Blob:

// app/components/audio-recorder.tsx
'use client'
export default function AudioRecorder() {
    function handleClick(){
      console.log('click')
    }

    return (
        <section>
        <button onClick={handleClick}
                    className={`bg-blue-500 text-white px-4 py-2 rounded shadow-md hover:bg-blue-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:ring-offset-white transition duration-300 ease-in-out absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2`}>
                Record voice
            </button>
        </section>
    )
}

是時(shí)候?qū)⒋算^子與我們的 AudioRecorder 元件連接起來了:

// app/page.tsx
import AudioRecorder from '@/app/components/audio-recorder';

export default function Home() {
  return (
      <AudioRecorder />
  );
}

讓我們看看硬幣的另一面,後端!

設(shè)定我們的伺服器端

我們希望在伺服器上使用我們的模型來確保安全並運(yùn)行得更快。讓我們建立一個(gè)新路由並使用 Next.js 中的路由處理程序?yàn)槠湫略鲆粋€(gè)處理程序。在我們的 App 資料夾中,建立一個(gè)「Api」資料夾,其中包含以下路由:

我們希望在伺服器上使用我們的模型來確保安全並運(yùn)行得更快。讓我們建立一個(gè)新路由並使用 Next.js 中的路由處理程序?yàn)槠湫略鲆粋€(gè)處理程序。在我們的 App 資料夾中,建立一個(gè)「Api」資料夾,其中包含以下路由:

app
 ?hooks
  ?useRecordVoice.ts

import { useEffect, useRef, useState } from 'react';

export function useRecordVoice() {
  return {}
}

我們的路線稱為「聊天」。在route.ts檔案中,我們將設(shè)定我們的處理程序。讓我們從設(shè)定 OpenAI SDK 開始。

// apps/hooks/useRecordVoice.ts
import { useEffect, useRef, useState } from 'react';

export function useRecordVoice() {
    const [isRecording, setIsRecording] = useState(false);
    const [mediaRecorder, setMediaRecorder] = useState<MediaRecorder | null>(null);

     const startRecording = async () => {
        if(!navigator?.mediaDevices){
            console.error('Media devices not supported');
            return;
        }

        const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
        const mediaRecorder = new MediaRecorder(stream);
        setIsRecording(true)
        setMediaRecorder(mediaRecorder);
        mediaRecorder.start(0)
    }

    const stopRecording = () =>{
        if(mediaRecorder) {
            setIsRecording(false)
            mediaRecorder.stop();
        }
    }

  return {
    isRecording,
    startRecording,
    stopRecording,
  }
}

在此路線中,我們將從前端作為 Base64 字串發(fā)送音訊。然後,我們將接收它並將其轉(zhuǎn)換為 Buffer 物件。

 const [isRecording, setIsRecording] = useState(false);
    const [mediaRecorder, setMediaRecorder] = useState<MediaRecorder | null>(null);

是時(shí)候使用我們的第一個(gè)模型了。我們希望將此音訊轉(zhuǎn)換為文本,並使用 OpenAI 的 Whisper Speech-To-Text 模型。 Whisper 需要音訊檔案來建立文字。由於我們有一個(gè) Buffer 而不是文件,因此我們將使用他們的“toFile”方法將音頻 Buffer 轉(zhuǎn)換為音頻文件,如下所示:

// check if they have media devices
if(!navigator?.mediaDevices){
 console.error('Media devices not supported');
 return;
}
// create stream using the audio media device
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });

請(qǐng)注意,我們指定了「mp3」。這是 Whisper 模型可以使用的眾多擴(kuò)充之一。您可以在此處查看支援的擴(kuò)充功能的完整清單:https://platform.openai.com/docs/api-reference/audio/createTranscription#audio-createtranscription-file

現(xiàn)在我們的文件已準(zhǔn)備就緒,讓我們將其傳遞給 Whisper!使用我們的 OpenAI 實(shí)例,我們將這樣呼叫我們的模型:

// create an instance passing in the stream as parameter
const mediaRecorder = new MediaRecorder(stream);
// Set this state to true to 
setIsRecording(true)
// Store the instance in the state
setMediaRecorder(mediaRecorder);
// Start recording inmediately
mediaRecorder.start(0)

就是這樣!現(xiàn)在,我們可以繼續(xù)下一步:使用 Llama 3.1 來解釋這段文本並給我們一個(gè)答案。我們將使用兩種方法。首先,我們將使用“ollama-ai-provider”套件中的“ollama”,它允許我們將此模型與本地運(yùn)行的 Ollama 一起使用。然後,我們將使用 Vercel AI SDK 中的「generateText」來產(chǎn)生文字。
附註:為了讓我們的 Ollama 在本地運(yùn)行,我們需要在終端機(jī)中編寫以下命令:

npx create-next-app@latest
npm i ai ollama-ai-provider openai

最後,我們有了最後一個(gè)模型:來自 OpenAI 的 TTS。我們想用音訊回覆用戶,所以這個(gè)模型會(huì)非常有幫助。它將把我們的文字變成語(yǔ)音:

app
 ?components
  ?audio-recorder.tsx

TTS 模型會(huì)將我們的回應(yīng)轉(zhuǎn)換為音訊檔案。我們希望將此音訊串流回用戶,如下所示:

// app/components/audio-recorder.tsx
'use client'
export default function AudioRecorder() {
    function handleClick(){
      console.log('click')
    }

    return (
        <section>
        <button onClick={handleClick}
                    className={`bg-blue-500 text-white px-4 py-2 rounded shadow-md hover:bg-blue-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 focus:ring-offset-white transition duration-300 ease-in-out absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2`}>
                Record voice
            </button>
        </section>
    )
}

這就是整個(gè)後端程式碼!現(xiàn)在,回到前端完成所有連接。

把它們放在一起

在我們的 useRecordVoice.tsx 掛鉤中,我們建立一個(gè)新方法來呼叫我們的 API 端點(diǎn)。此方法還將取回回應(yīng)並向用戶播放我們從後端串流的音訊。

// app/page.tsx
import AudioRecorder from '@/app/components/audio-recorder';

export default function Home() {
  return (
      <AudioRecorder />
  );
}

太棒了!現(xiàn)在我們已經(jīng)收到了串流響應(yīng),我們需要處理它並向用戶播放音訊。為此,我們將使用 AudioContext API。該 API 允許我們儲(chǔ)存音訊、對(duì)其進(jìn)行解碼並在準(zhǔn)備好後向用戶播放:

app
 ?hooks
  ?useRecordVoice.ts

import { useEffect, useRef, useState } from 'react';

export function useRecordVoice() {
  return {}
}

就是這樣!現(xiàn)在,用戶應(yīng)該在其設(shè)備上聽到音訊響應(yīng)。最後,讓我們透過添加一個(gè)小的載入指示器來讓我們的應(yīng)用程式變得更好一點(diǎn):

// apps/hooks/useRecordVoice.ts
import { useEffect, useRef, useState } from 'react';

export function useRecordVoice() {
    const [isRecording, setIsRecording] = useState(false);
    const [mediaRecorder, setMediaRecorder] = useState<MediaRecorder | null>(null);

     const startRecording = async () => {
        if(!navigator?.mediaDevices){
            console.error('Media devices not supported');
            return;
        }

        const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
        const mediaRecorder = new MediaRecorder(stream);
        setIsRecording(true)
        setMediaRecorder(mediaRecorder);
        mediaRecorder.start(0)
    }

    const stopRecording = () =>{
        if(mediaRecorder) {
            setIsRecording(false)
            mediaRecorder.stop();
        }
    }

  return {
    isRecording,
    startRecording,
    stopRecording,
  }
}

結(jié)論

在這篇文章中,我們了解了組合多個(gè)人工智慧模型如何幫助我們實(shí)現(xiàn)目標(biāo)。我們學(xué)會(huì)了在本地運(yùn)行 Llama 3.1 等 AI 模型,並在我們的 Next.js 應(yīng)用程式中使用它們。我們還發(fā)現(xiàn)瞭如何將音訊發(fā)送到這些模型並流迴響應(yīng),將音訊播放回用戶。

這只是使用人工智慧的眾多方式之一——可能性是無限的。人工智慧模型是令人驚嘆的工具,它讓我們能夠創(chuàng)造出曾經(jīng)難以以如此高的品質(zhì)實(shí)現(xiàn)的東西。感謝您的閱讀;現(xiàn)在,輪到你用 AI 建造一些令人驚嘆的東西了!

您可以在 GitHub 上找到完整的示範(fàn):AI Assistant with Whisper TTS and Ollama using Next.js

以上是如何使用 OpenAI、Vercel AI SDK 和 Ollama 以及 Next.js 建立 AI 助手的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
如何在node.js中提出HTTP請(qǐng)求? 如何在node.js中提出HTTP請(qǐng)求? Jul 13, 2025 am 02:18 AM

在Node.js中發(fā)起HTTP請(qǐng)求有三種常用方式:使用內(nèi)置模塊、axios和node-fetch。 1.使用內(nèi)置的http/https模塊無需依賴,適合基礎(chǔ)場(chǎng)景,但需手動(dòng)處理數(shù)據(jù)拼接和錯(cuò)誤監(jiān)聽,例如用https.get()獲取數(shù)據(jù)或通過.write()發(fā)送POST請(qǐng)求;2.axios是基於Promise的第三方庫(kù),語(yǔ)法簡(jiǎn)潔且功能強(qiáng)大,支持async/await、自動(dòng)JSON轉(zhuǎn)換、攔截器等,推薦用於簡(jiǎn)化異步請(qǐng)求操作;3.node-fetch提供類似瀏覽器fetch的風(fēng)格,基於Promise且語(yǔ)法簡(jiǎn)單

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時(shí)復(fù)制副本,因此互不影響;引用類型如對(duì)象、數(shù)組和函數(shù)存儲(chǔ)的是內(nèi)存地址,指向同一對(duì)象的變量會(huì)相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問題。理解這兩類差異有助於編寫更穩(wěn)定可靠的代碼。

JavaScript時(shí)間對(duì)象,某人構(gòu)建了一個(gè)eactexe,在Google Chrome上更快的網(wǎng)站等等 JavaScript時(shí)間對(duì)象,某人構(gòu)建了一個(gè)eactexe,在Google Chrome上更快的網(wǎng)站等等 Jul 08, 2025 pm 02:27 PM

JavaScript開發(fā)者們,大家好!歡迎閱讀本週的JavaScript新聞!本週我們將重點(diǎn)關(guān)注:Oracle與Deno的商標(biāo)糾紛、新的JavaScript時(shí)間對(duì)象獲得瀏覽器支持、GoogleChrome的更新以及一些強(qiáng)大的開發(fā)者工具。讓我們開始吧! Oracle與Deno的商標(biāo)之爭(zhēng)Oracle試圖註冊(cè)“JavaScript”商標(biāo)的舉動(dòng)引發(fā)爭(zhēng)議。 Node.js和Deno的創(chuàng)建者RyanDahl已提交請(qǐng)願(yuàn)書,要求取消該商標(biāo),他認(rèn)為JavaScript是一個(gè)開放標(biāo)準(zhǔn),不應(yīng)由Oracle

處理諾言:鏈接,錯(cuò)誤處理和承諾在JavaScript中 處理諾言:鏈接,錯(cuò)誤處理和承諾在JavaScript中 Jul 08, 2025 am 02:40 AM

Promise是JavaScript中處理異步操作的核心機(jī)制,理解鍊式調(diào)用、錯(cuò)誤處理和組合器是掌握其應(yīng)用的關(guān)鍵。 1.鍊式調(diào)用通過.then()返回新Promise實(shí)現(xiàn)異步流程串聯(lián),每個(gè).then()接收上一步結(jié)果並可返回值或Promise;2.錯(cuò)誤處理應(yīng)統(tǒng)一使用.catch()捕獲異常,避免靜默失敗,並可在catch中返回默認(rèn)值繼續(xù)流程;3.組合器如Promise.all()(全成功才成功)、Promise.race()(首個(gè)完成即返回)和Promise.allSettled()(等待所有完成)

什麼是緩存API?如何與服務(wù)人員使用? 什麼是緩存API?如何與服務(wù)人員使用? Jul 08, 2025 am 02:43 AM

CacheAPI是瀏覽器提供的一種緩存網(wǎng)絡(luò)請(qǐng)求的工具,常與ServiceWorker配合使用,以提升網(wǎng)站性能和離線體驗(yàn)。 1.它允許開發(fā)者手動(dòng)存儲(chǔ)如腳本、樣式表、圖片等資源;2.可根據(jù)請(qǐng)求匹配緩存響應(yīng);3.支持刪除特定緩存或清空整個(gè)緩存;4.通過ServiceWorker監(jiān)聽fetch事件實(shí)現(xiàn)緩存優(yōu)先或網(wǎng)絡(luò)優(yōu)先等策略;5.常用於離線支持、加快重複訪問速度、預(yù)加載關(guān)鍵資源及後臺(tái)更新內(nèi)容;6.使用時(shí)需注意緩存版本控制、存儲(chǔ)限制及與HTTP緩存機(jī)制的區(qū)別。

JS綜述:深入研究JavaScript事件循環(huán) JS綜述:深入研究JavaScript事件循環(huán) Jul 08, 2025 am 02:24 AM

JavaScript的事件循環(huán)通過協(xié)調(diào)調(diào)用棧、WebAPI和任務(wù)隊(duì)列來管理異步操作。 1.調(diào)用棧執(zhí)行同步代碼,遇到異步任務(wù)時(shí)交由WebAPI處理;2.WebAPI在後臺(tái)完成任務(wù)後將回調(diào)放入相應(yīng)的隊(duì)列(宏任務(wù)或微任務(wù));3.事件循環(huán)檢查調(diào)用棧是否為空,若為空則從隊(duì)列中取出回調(diào)推入調(diào)用棧執(zhí)行;4.微任務(wù)(如Promise.then)優(yōu)先於宏任務(wù)(如setTimeout)執(zhí)行;5.理解事件循環(huán)有助於避免阻塞主線程並優(yōu)化代碼執(zhí)行順序。

了解事件在JavaScript DOM事件中冒泡和捕獲 了解事件在JavaScript DOM事件中冒泡和捕獲 Jul 08, 2025 am 02:36 AM

事件冒泡是從目標(biāo)元素向外傳播到祖先節(jié)點(diǎn),事件捕獲則是從外層向內(nèi)傳播到目標(biāo)元素。 1.事件冒泡:點(diǎn)擊子元素後,事件依次向上觸發(fā)父級(jí)元素的監(jiān)聽器,例如點(diǎn)擊按鈕後先輸出Childclicked,再輸出Parentclicked。 2.事件捕獲:設(shè)置第三個(gè)參數(shù)為true,使監(jiān)聽器在捕獲階段執(zhí)行,如點(diǎn)擊按鈕前先觸發(fā)父元素的捕獲監(jiān)聽器。 3.實(shí)際用途包括統(tǒng)一管理子元素事件、攔截預(yù)處理和性能優(yōu)化。 4.DOM事件流分為捕獲、目標(biāo)和冒泡三個(gè)階段,默認(rèn)監(jiān)聽器在冒泡階段執(zhí)行。

超越地圖和過濾器的高階功能的JS綜述 超越地圖和過濾器的高階功能的JS綜述 Jul 10, 2025 am 11:41 AM

JavaScript數(shù)組中,除了map和filter,還有其他強(qiáng)大且不常用的方法。 1.reduce不僅能求和,還可計(jì)數(shù)、分組、展平數(shù)組、構(gòu)建新結(jié)構(gòu);2.find和findIndex用於查找單個(gè)元素或索引;3.some和every用於判斷是否存在或全部滿足條件;4.sort可排序但會(huì)改變?cè)瓟?shù)組;5.使用時(shí)注意複製數(shù)組避免副作用。這些方法使代碼更簡(jiǎn)潔高效。

See all articles